JavaScript中调皮的undefined

在JavaScript中undefined只是一个标识符,不是关键字,这个很不靠谱的标识符还不能像其他符号一样随意使用,一方面是需要它的原始值保持不变,另一方面是用法不当还会产生很多意向不到的bug。有这种不靠谱的标识符的语言遗留问题,我们在编程时为了保证这家伙始终如一,保证我们的程序强壮性,就得使用一些手段了。

function foo() {
undefined = 2;//undefined
}
function bar(){
"use strict";
undefined = 2;//TypeError
}
foo();
bar();

从上面的运行来看,undefined在没有被关键字var执行声明的情况下,undefined的原始值并不能被直接修改。

"use strict";
var undefined = 2;//TypeError

在严格模式下全局上声明undefined并赋值还是报错。

var undefined = 2;
console.log(undefined);//undefined

全局非严格模式下undefined即使声明undefined为变量还是不能修改它的值。

function foo(){
"use strict";
var undefined = 2;
console.log(undefined);//
}
foo();

只有在非全局作用域下声明undefined为局部变量可改变值,且在严格模式下也能不报错。研究undefined的标识符被修改值绝对不是想修改它,而是我们要明白在什么情况下会因为无意的修改它的值,或者因为不恰当的操作会报错。这还只是一方面,另一方面是我要怎么样才能保证我们能获得一个真正的undefined的值。

通常我们为了保证我们局部作用域获得的undefined的值就是一个真正的undefined的值,有三种方式:

function foo(a,b,undefined){
console.log(a);
console.log(b);
console.log(undefined);
}
//在形参中定义undefined,但在实参中不传值
//就可以保证这个局部作用域下的undefined是一个真正的undefined
foo("a","b");
//在jQuery中,构建jQuery的模块时就使用了这种方法
(function(window,undefined){
//....
})(window);

还有一种情况就是不让表达式返回任何结果:

function doSomething(){
if(!APP.ready){
return void setTimeout(doSomething,100);
}
var result;
  //...
return result;
}
if(doSomething()){
//...
}

void运算符可以保证后面的程序正常执行,但永远返回undefined。这里setTimeout(...)函数会返回一个数值(计时器间隔的唯一标识符,用来取消计时器),但是为了保证if语句不产生误报(false positive),我们需要void去掉它。

JavaScript中调皮的undefined的更多相关文章

  1. JavaScript中Null和Undefined的深渊

    探索JavaScript中Null和Undefined的深渊 当讨论JavaScript中的原始数据类型时,大多数人都知道的基本知识,从String,Number到Boolean.这些原始类型相当简单 ...

  2. JavaScript中null和undefined

    JavaScript的数据类型大体分为两类:原始类型和对象类型.其中,原始类型包括数字.字符串和布尔值.此外,JavaScript中还有两个特殊的原始值:null(空)和undefined(未定义), ...

  3. 探索JavaScript中Null和Undefined的深渊

    当讨论JavaScript中的原始数据类型时,大多数人都知道的基本知识,从String,Number到Boolean.这些原始类型相当简单,行为符合常识.但是,本文将更多聚焦独特的原始数据类型Null ...

  4. Javascript中类型: undefined, number ,string ,object ,boolean

    var a1; var a2 = true;var a3 = 1;var a4 = "Hello";var a5 = new Object();var a6 = null;var ...

  5. javascript中typeof、undefined 和 null

    typeof 是运算符,注意不是函数,是运算符,其作用,是考察变量究竟是什么类型.或曰,是变量是否定义或是否初始化的照妖镜.返回值是字符串. undefined 表示一个对象没有被定义或者没有被初始化 ...

  6. JavaScript中null和undefined的总结

    先说null,它表示一个特殊值,常用来描述“空值”.对null执行typeof运算,结果返回字符串“object”,也就是说,可以将null认为是一个特殊的对象值,含义是“非对象”(感觉怪怪的).实际 ...

  7. JavaScript中Null和Undefined的区别

    Null: null是js中的关键字,表示空值,null可以看作是object的一个特殊的值,如果一个object值为空,表示这个对象不是有效对象. Undefined: undefined不是js中 ...

  8. Javascript 中 null和undefined的区别

    null表示"没有对象",即该处不应该有值.典型用法是: (1) 作为函数的参数,表示该函数的参数不是对象. (2) 作为对象原型链的终点. Object.getPrototype ...

  9. javascript中null与undefined的区别

    1.null null是一个对象,表示一个空对象指针,typeof(null)返回object,null参与运算时会转化为0,将对象初始化为null,可以知道变量是否保存了对象的引用 2.undefi ...

随机推荐

  1. Java异步、线程池解决方案

    一.ThreadPoolExecutor------线程池 private static final ThreadPoolExecutor threadPoolExecutor = new Threa ...

  2. 2010 SD - ICPC D - Emergency

    D - Emergency Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit  ...

  3. IOS端 margin-top 和 margin-bottom 使用负数时的区别

    有以下html代码 <div style="width: 30%;" class="shang"> 1 </div> <div s ...

  4. JVM垃圾收集(Java Garbage Collection / Java GC)

    JVM垃圾收集(Java Garbage Collection / Java GC) Java7 Java8 JDK1.8之后将最初的永久代取消了,由元空间取代. 堆内存调优简介 public sta ...

  5. 「SCOI2015」小凸玩矩阵 解题报告

    「SCOI2015」小凸玩矩阵 我好沙茶啊 把点当边连接行和列,在外面二分答案跑图的匹配就行了 我最开始二分方向搞反了,样例没过. 脑袋一抽,这绝壁要费用流,连忙打了个KM 然后wa了,一想这个不是完 ...

  6. python 逻辑运算符问题

    1 正确 if('A' not in self.storageDevice.softVersion or\ 'B' not in self.storageDevice.softVersion or\ ...

  7. Fiddler 安装配置及使用技巧

    下载最新版即可: https://www.telerik.com/fiddler pc配置: pc端上的配置较为简单,主要是记录一下遇到的一些bug以及解决方法. options>HTTPS  ...

  8. 解决Oracle死锁问题步骤

    出现问题: 使用jdbc进行批量插入,一直卡在执行界面上,不走代码,预估应该是产生了死锁 1. 使用如下语句查询oracle数据库中的死锁的表和死锁类型 select b.owner,b.object ...

  9. pre标签内文本自动换行

    pre标签内文本自动换行 给pre标签添加一个css样式 pre { white-space: pre-wrap; /* css-3 */ white-space: -moz-pre-wrap; /* ...

  10. Python经典算法片段

    将一个正整数分解质因数 #!/bin/env python2 # -*- coding: UTF-8 -*- def reduceNum(n): print '{} = '.format(n), if ...