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. GCD HDU - 1695 (欧拉 + 容斥)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  2. Ikki's Story IV - Panda's Trick POJ - 3207(水2 - sat 在圈内 还是 在圈外)

    题意: 就是一个圈上有n个点,给出m对个点,这m对个点,每一对都有一条边,合理安排这些边在圈内或圈外,能否不相交 解析: 我手残 我手残 我手残 写一下情况 只能是一个在圈外 一个在圈内 即一个1一个 ...

  3. scrapy简单使用

    #settings.py文件设置 #如果网站中没有robots文件,就不会抓取任何数据 ROBOTSTXT_OBEY = False #设置请求头 DEFAULT_REQUEST_HEADERS = ...

  4. 【hdu 4658】Integer Partition (无序分拆数、五边形数定理)

    hdu 4658 Integer Partition 题意 n分拆成若干个正整数的和,每个正整数出现小于k次,分拆方案有多少.(t<=100,n<=1e5) 题解 之前写过一篇Partit ...

  5. 【C++】实现一个简单的单例模式

  6. NOIp 2018 游记

    Day0 啥都没做,记了一下 vimrc 和配置,然后搞了一下午的颓. 然后头有点晕乎乎的,早点洗澡去睡觉,在床上想了很多,但还是强制自己大脑放空,早点睡着了. Day1 由于去年的教训,今年我决定先 ...

  7. Educational Codeforces Round 51 (Rated for Div. 2) G. Distinctification(线段树合并 + 并查集)

    题意 给出一个长度为 \(n\) 序列 , 每个位置有 \(a_i , b_i\) 两个参数 , \(b_i\) 互不相同 ,你可以进行任意次如下的两种操作 : 若存在 \(j \not = i\) ...

  8. Android自带Monkey测试

    Monkey是在模拟器上或设备上运行的一个小程序,它能够产生为随机的用户事件流,例如点击(click),触摸(touch),挥手(gestures),还有一系列的系统级事件.可以使用Monkey来给正 ...

  9. jconsole 连接 wildfly 10 监控

    1,远程wildfly服务器: 访问:http://211.100.75.242:9990 按照提示添加用户,重启后可以登录进入.成功. 2,省事做法.本地解压wildfly服务器,进入wildfly ...

  10. 【模板】2-SAT

    题目大意:给定 N 个点的 M 条约束,约束形式为:\(a_i \lor a_j = 1\). 题解:拆点什么的就不说了,在求出一组解的时候,考虑到 Tarjan 找环的过程中,scc 染色是按照拓扑 ...