写在前面:最近做一些面试题时,发现有很多知识点理解的还是不够充分。。这里集中记录一下,就不再做归类了,都属于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指向问题
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。