1.预编译与引用类赋值
var foo = {n: 1};
(function(foo){
console.log(foo.n);//1
foo.n = 3;
var foo = {n: 2};
console.log(foo.n);//2
})(foo);
console.log(foo.n);//3
答案解析:
GO:foo = {n: 1}
function = {};
函数AO:foo;
形参和实参相统一,GO的foo和AO的foo指向同一栈空间,
函数执行:
foo.n = 3会改变栈空间内的值,此时GO中foo.n的值会改变
foo = {n: 2};使AO中的foo指向了新的栈空间
- 页面产生便创建了GO全局对象(Global Object)(也就是window对象);
- 第一个脚本文件加载;
- 脚本加载完毕后,分析语法是否合法;
- 开始预编译
预编译是在函数执行前一刻发生的
- 创建AO对象(Active Object);
- 查找形参和变量声明,值赋予undefined;
- 实参值赋给形参;
- 查找函数声明,值赋予函数体
2.能检测一个对象str是否是String类型的方法
3.返回0的Number类型转换
Number()
Number(0)
Number('')
Number('0')
Number(false)
Number(null)
Number([])
Number([0])
4.JS返回false的六种情况
false, "", 0, undefined, null , NaN
5.
console.log('Value is ' + (val != '0') ? 'define' : 'undefine');
加号优先级高于 三目运算。低于括号。 所以括号中无论真假 加上前边的字符串都为 TRUE 三目运算为TRUE是 输出 define
6.
null和undefined单独和别的比较都为false,但是null和undefined比较就为true,因为undefined就是null衍生出来的一个对象
7. __proto__和prototype
__proto__和prototype,Function.prototype和Object.prototype文章参考
var F = function (){};
Object.prototype.a = function(){console.log('a');}
Function.prototype.b = function(){console.log('b')}
var f = new F();
f.a() --->a
f.b() --->Uncaught TypeError: f.b is not a function
解析:
f.__proto__ == F.prototype
true
F.prototype.__proto__ == Object.prototype
true
F.prototype.__proto__ == Function.prototype
false