1.未赋值的变量可以被访问,但未声明的不可以。
-未声明的变量只能进行 typeof 操作。
2.Object.prototype.toString ( ) 方法
3.NaN的类型是 Number
4.Math.max()和Math.min()的使用方法
Math.max()
-返回给出的零个或多个数值表达式中较大者。 -如果没有给出参数,返回值等于 NEGATIVE_INFINITY。如果有参数为 NaN,返回值仍然为 NaN。
Math.min()
-返回给出的零个或多个数值表达式中较小的值。 -如果没有给出参数,返回值等于 POSITIVE_INFINITY。如果有参数为 NaN,返回值也为 NaN。
5.语句优先
表达式 | 分析 |
---|---|
[]+{} | {}作为右值出现被理解为对象直接量。 |
{}+[] | 根据语句优先原则 {}被理解为复合语句块,因此相当于 {}; +[] 。[]为空,结果为0。 |
console.log({}+[]) | js把()中的语句当做一个表达式,因此{}不能被理解为语句块,而被理解为”[object Object]” + “”,console.log(“[object Object]”+”“)打印结果为[object Object]。 |
6.!逻辑运算符
!false //true
!0 //true
!undefined //true
!null //true
!"" //true
//由此我们可以简写变量不为空
var a;
if(a!=null&&typeof(a)!=undefined&&a!=''){
//a有内容才执行的代码
}
if(!!a){
//a有内容才执行的代码...
}
我不知道该怎么编了…
7.“==”逻辑运算符会将两边的值转为相同类型
- true 转为 1,false转为 0.
8.预处理
- 先变量,后函数
function b() {
}
var b
console.log(typeof b)
9.typeof
(function(){
return typeof arguments;//"object"
})();
10.函数被变量在定义是引用为undefined
var p = function test(){
}
test();// ReferenceRrror: test is not defined
test; //"undefined"
- test可以被重新赋予其他值,也可以在函数内部调用。
递归最好的方法是调用 arguments.callee;
11.delete阻断对对象属性的引用(并不会释放内存,也无法阻断变量的引用)
(function(x){
delete x;
return x;//1
})(1);
//正确用法
delete object.property
delete object['property']
12.利用未声明变量只能进行typeof操作,判断是否声明
try{
if(a == undefined || a){
console.log("existing");
}
}catch(err){
console.log("no existing");
}
var a;
//结果:existing
13.函数闭包
var foo = {
bar: function() { return this.baz; },
baz: 1
};
(function(){
return typeof arguments[0]();//"undefined"
})(foo.bar);
//传递参数可以看做是赋值,arguments[0]所在的作用域和foo所在的域相同。
14.逗号操作符
逗号操作符 对它的每个操作对象求值(从左至右),然后返回最后一个操作对象的值
(function f(){ return '1'; }, function g(){ return 2; })(); //2
15.自己看吧,我也不知道为什么
16.构造函数的返回值会覆盖new原先应有的返回值
new f 和 new f()相同,但前者使用在没有传参的情况下。
通常来说构造函数是没有返回值的,但如果有返回值会覆盖掉new出来的对象。
function f() {
return f;
}
new f() instanceof f; //false
17.with将对象添加作用域链的顶端
函数的length属性,代表参数的个数。
with (function(x, undefined){});
length;//2