!!用法
var y = undefined;
console.log(!y);//true
var x = false;
var a = 0;
var b = null
var text = !!x;//false
console.log(test);//false
console.log(!!a);//false
console.log(!!b);//false
由于!对于undefined以及0 以及null返回值都是true。但对于!!操作符,就拿上面的例子来说,如果x明确指出了true还是false,那么!!x将返回和x一样的值。否则返回false。
另外,如果x是有内容的,比如x=3,x=[2,1]等。那么!!将返回true。
总结一下:
x | 结果 |
---|---|
布尔值 | 返回x |
非undefined、null、0 | 返回true |
undefined null 0 | 返回false |
with用法
一般的我们Object.property访问类的属性。
function abcObj(){
this.name = "张三";
this.gender = "男";
}
var people = new abcObj();//创建一个对象
比如上例中我们通过people.name即可访问属性,但是同时修改很多属性的时候会写起来很烦。因此有with方法
with(people){
alert(name);//张三
name="李四";//修改属性
var name = "123";//特别注意即便用var进行重新赋值也会修改people的name属性
}
但是要注意的是,在with中不能给对象添加属性值。
联系到哦Javascript高级程序设计(第三版)75页的内容,with可以延长作用域链。
书中代码如下
function buildUrl(){
var qs = "?debug=true";
with(location){
var url = href + qs;
}
return url;
}
正常来讲,url是在一个代码块中被定义的,return应该无法返回,然而实验结果是可以返回的。原因在于:刚才我们提到了with实际上是引入了一个对象的新的作用域。然而这个作用域中是不能添加新的属性的,因此var实际是定义在更上一层中,因此可以访问到正确的结果。
关于作用域问题。javascript高级程序设计一书中指出。没有块级作用于。有的只是函数级作用域。例如if和for都没有自己的作用域。
if(true){
var color = "blue";
}
alert(color);//blue
for(var i = 0 ; i < 10 ; i++){
doSomething(i);
}
console.log(i);//10
for语句创建的i变量仍然存在于外部环境中!这一点要牢记。
声明变量与作用域
一般我们用var声明变量。会自动把变量添加到最近的环境中。在函数内部,最接近的环境就是函数的局部环境。如果没有用var声明变量,变量将被添加到全局变量
我们不建议不声明变量就是用的方法,会导致意外的错误。另外,访问局部变量明显比访问全局变量要快,因此我们建议少使用全局变量。如果要在局部环境中不使用局部变量而使用全局变量,方法是调用window.变量名。