编译器(把代码解析成为浏览器看得懂的结构):词法解析 / AST抽象语法树 / 构建出浏览器能够执行的代码
引擎(V8引擎,webkit内核): 变量提升 / 作用域、闭包 / 变量对象 / 堆栈内存 / GO、VO、AO、EC、ECStack
let a = { n : 10 };
let b = a;
b.n = 20;
console.log(a.n); //20
let a = { n : 10 };
let b = a;
b = { n : 20 };
console.log(a.n); //10
引擎处理流程图:
面试题:
1、
let a = { n : 10 };
let b = a;
b.m = b = { n : 20 }; //即 c = { n : 20 } b.m = c b = c
console.log(a); //{n:10,m:{n:20}}
console.log(b); //{n:20}
2、
let x = [12,23];
function fn(y){ //即 y = x;
y[0] = 100;
y = [100];
y[1] = 200;
console.log(y); // [100,200]
}
fn(x);
console.log(x); // [100,23]
3、
//非严格模式下,arguments和形参之间会建立映射关系
function fn(x,y){
console.log(x,y,arguments); //10,20,[10,20]
arguments[0] = 100;
y = 200;
console.log(x,y,arguments); //100,200,[100,200]
}
fn(10,20);
"use strict";
//"use strict" 必须写在js代码第一行,或者函数内第一行(只对当前函数执行使用严格模式)
//严格模式下,arguments和形参之间 不会 建立映射关系
function fn(x,y){
console.log(x,y,arguments); //10,20,[10,20]
arguments[0] = 100;
y = 200;
console.log(x,y,arguments); //10,200,[100,20]
}
fn(10,20);
//只传一个参数,arguments[1]不存在,更不存在映射关系
function fn(x,y){
console.log(x,y,arguments); //10,undefined,[10]
arguments[0] = 100;
y = 200;
console.log(x,y,arguments); //100,200,[100]
}
fn(10);
4、
var x =10;
~ function(x){
console.log(x); // undefined;
x = x || 20 && 30 || 40; // &&优先级高于||
console.log(x); // 30
}();
console.log(x); // 10
5、
let x = [1,2],
y = [3,4];
~function(x){
x.push("A");
x = x.slice(0);
x.push("B");
x = y;
x.push("C");
console.log(x,y); // [3,4,"C"] [3,4,"C"]
}(x);
console.log(x,y);//[1,2,"A"] [3,4,"C"]
6、
let res = parseFloat('left:200px'); //NaN
if(res === 200){
alert(200);
}else if(res === NaN){ //NaN不等于任何值,包括自身
alert(NaN);
}else if(typeof res === 'number'){ //typeof NaN => 'number'
alert("number");
}else{
alert("Invalid Number");
}