这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战。
立即执行函数和作用域
var a = 123;
(function a () {
a = 'abc';
console.log(a);
})();
答案:
ƒ a () {
a = 'abc';
console.log(a);
}
说明
- 立即执行函数 IIFE,可以模拟块级作用域,即在一个函数表达式内部声明变量,然后立即调用这个函数。这 样位于函数体作用域的变量就像是在块级作用域中一样。
- 如果立即执行函数名称跟内部变量名称重名,函数名称优先
- 在严格模式 'use strict'; 下该代码会报错
String和switch
var str = new String(123);
switch (str) {
case '123': {
console.log('string 123');
break;
}
case 123: {
console.log(`number 123`);
break;
}
case undefined: {
console.log(`undefined value`);
break;
}
default: {
console.log('unknown value');
break;
}
}
答案:会输出 unknown value
说明
-
- var str = new String(123); 时候 str 是类 String的示例,类型是Object
-
- switch 是严格比较,所以 str === '123' 为 false
-
- str 与上面的 value 值都不匹配,执行default输出 unknown value
-
- MDN上有提到一个 switch 语句首先会计算其 expression 。然后,它将从第一个 case 子句开始直到寻找到一个其表达式值与所输入的 expression 的值所相等的子句(使用 严格运算符 (en-US),
===
)并将控制权转给该子句,执行相关语句。
- MDN上有提到一个 switch 语句首先会计算其 expression 。然后,它将从第一个 case 子句开始直到寻找到一个其表达式值与所输入的 expression 的值所相等的子句(使用 严格运算符 (en-US),
Object.getPrototypeOf原型
function A() {};
var a0 = new A();
var a1= {};
a1.__proto__ = A.prototype;
var a2 = {};
a2.__proto__ = Object.getPrototypeOf(new A());
var a3 = {};
a3.__proto__ = Object.getPrototypeOf(A);
console.log(a0 instanceof A);
console.log(a1 instanceof A);
console.log(a2 instanceof A);
console.log(a3 instanceof A);
答案:true, true, true, false
说明
Object.getPrototypeOf()
方法返回指定对象的原型(内部[[Prototype]]
属性的值)
var a0 = new A();
// a0 原型 __proto__ 会自动指向 A.prototype
// 所以 a0 instanceof A 为 true;
var a1= {};
a1.__proto__ = A.prototype;
// a1 原型 __proto__ 直接指向 A.prototype
// 所以 a0 instanceof A 为 true;
var a2 = {};
a2.__proto__ = Object.getPrototypeOf(new A());
// Object.getPrototypeOf(new A()) 是指向 new A() 对象的原型.
// 所以 a2.__proto__ 指向 A.prototype
// 所以 a2 instanceof A 为 true;
var a3 = {};
a3.__proto__ = Object.getPrototypeOf(A);
// Object.getPrototypeOf(A) 是指向 A 函数的原型.
// 所以 a2.__proto__ 指向 Function.prototype
// 所以 a2 instanceof A 为 false;