写在前面:最近做一些面试题时,发现有很多知识点理解的还是不够充分。。这里集中记录一下,就不再做归类了,都属于js基础

题1.

知识点:作用域、变量提升、运算符优先级等

问题:试解释以下示例中每一个输出及输出原因

if(!a) {
 a = 1;
}
alert(a) // Uncaught ReferenceError: a is not defined
if(!a) {
 var a = 1;
}
alert(a) // 1
if(a) {
 var a = 1;
}
alert(a) // undefined
console.log(a); // Uncaught ReferenceError: a is not defined
a = 1;
a = 1;
console.log(a); // 1
console.log(a); // undefined
var a = 1;
if(!b) {
 b = 1;
}
alert(b) // Uncaught ReferenceError: b is not defined
// 等价于 if(true) {...}
if(!window.b) {
 b = 1;
}
alert(b) // 1;
// 等价于 if(false) {...}
if(window.b) {
 b = 1;
}
alert(b) // Uncaught ReferenceError: b is not defined
if(! "c" in window) {
 c = 1;
}
alert(c) // Uncaught ReferenceError: c is not defined
if(! ("c" in window)) {
 c = 1;
}
alert(c) // 1
if(! "c" in window) {
 var c = 1;
}
alert(c) // undefined
if(! "d" in window) {
 let d = 1;
}
alert(d) // Uncaught ReferenceError: d is not defined

解释

alert(a); // Uncaught ReferenceError: a is not defined
alert(window.a); // undefined
alert(a in window); // Uncaught ReferenceError: a is not defined
alert('a' in window); // false
alert(!'a' in window); // false
alert(!('a' in window)); // true
console.log('a:' + a); // a:undefined
if(false) {
  var a = 1;
}
console.log('a:' + a); // a:undefined
console.log('a:' + a); // a:undefined
if(true) {
  var a = 1;
}
console.log('a:' + a); // a:1

题2.

知识点:全局函数,类型转换

问题:写出以下示例输出,并说明原因

Number({}); // NaN
Number([]); // 0
Number([1,2]); // NaN
Number(null); // 0
Number(undefined); // NaN
String({}); // '{object Object}'
String([]); // ''
String([1,2]); // '1,2'
String(null); // 'null'
String(undefined); // 'undefined'
Boolean({}); // true
Boolean([]); // true
Boolean(null); // false
Boolean(undefined); // false
console.log(!{}, !!{}); // false true
console.log(![], !![]); // false true
console.log({} == []); // false
console.log(null == undefined); // true
console.log(1+10 == '1'+'1'); // true

解释:(待验证,有确切答案后再补充)

  • “==”运算:通常会先对两边的值做Number()处理;
  • “+”运算:会根据两边的值的类型做不同的转换:

    • 两边都是string/number: 按该类型计算;
    • 一边number,另一边string: 按string计算;
    • 一边{},另一边string/number: 按number计算;
    • 一边[],另一边string/number: 按string计算;

暂定结论:

  • 两边都是原始数据类型:

    • +运算:若有string类型,则统一转换成string类型再运算;
    • ==比较:先“boolean”运算,若有“值”,再“值运算”;
  • 一边是原始类型,一边是引用类型:

    • +运算:先将引用类型依次执行valueOf(),toString()后再参与运算;

      • Date类型除外,Date类型执行valueOf()后不等于其自身;

        • (new Date()).valueOf(); // 1568708333316 (number类型)
        • (new Date()).toString(); // "Tue Sep 17 2019 16:19:03 GMT+0800 (中国标准时间)"
      • 有Date类型时,不再执行valueOf(),直接toString()后参与运算;

        • NaN + (new Date()); // "NaNTue Sep 17 2019 16:19:24 GMT+0800 (中国标准时间)"
    • ==比较:与+运算相同,都是先把引用类型处理为原始类型后再运算(比较)
  • 两边都是引用类型:

    • +运算:一般没这种操作,暂没找到固定规律,而且前后顺序不同,影响运算结果:

      • [] + {}; // 0
      • {} + []; // "[object Object]"
    • ==比较:相当于内存地址的比较

题3.

知识点:函数、自由变量、闭包等

问题:试解释以下示例中每一个输出及输出原因

var a = 10;
var fn = function() {
 a = 100;
}
fn();
console.log(a); // 100
var a = 10;
var fn = function(a) {
 a = 100;
}
fn();
console.log(a); // 10
var a = 10;
var fn = function() {
 var a = 100;
}
fn();
console.log(a); // 10
var a = 10;
var fn = function(a) {
 this.a = a;
}
fn(100);
console.log(a); // 100
var fn = function() {
 a = 100;
}
fn();
console.log(a); // 100
var fn = function() {
 var a = 100;
}
fn();
console.log(a); // Uncaught ReferenceError: a is not defined
console.log(a); // Uncaught ReferenceError: a is not defined
var fn = function() {
  a = 100;
}
fn(); // 函数没执行
console.log(a); // Uncaught ReferenceError: a is not defined
var fn = function() {
  var a = 100;
}
fn(); // 函数没执行

解释:1是闭包和自由变量的问题;2是函数传参问题;3是函数作用域问题;4是this指向问题


時雨
91 声望6 粉丝

慢慢地把云笔记上的内容搬过来~