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. synchronized 关键字解析

    synchronized 关键字解析 同步锁依赖于对象,每个对象都有一个同步锁. 现有一成员变量 Test,当线程 A 调用 Test 的 synchronized 方法,线程 A 获得 Test 的 ...

  2. 【HDU 6171】Admiral(搜索+剪枝)

    多校10 1001 HDU 6171 Admiral 题意 目标状态是第i行有i+1个i数字(i=0-5)共6行.给你初始状态,数字0可以交换上一行最近的两个和下一行最近的两个.求20步以内到目标状态 ...

  3. LVS负载均衡群集(NAT)

    ----构建NAT模式的LVS群集----------client---------------LVS----------------WEB1-----------WEB2------------NF ...

  4. [模板] 动态dp

    用途 对于某些树形dp(目前只会树上最大权独立集或者类似的),动态地修改点权,并询问修改后的dp值 做法(树剖版) 以最大权独立集为例 设$f[x][0/1]$表示x选不选,这棵子树的最大权独立集大小 ...

  5. CAN总线要点

    前言 CAN总线的应用在现在看来越来越广泛,我厂设备从最初的ARM9与ARM7平台.期间升级过度到CortexA8与Cortex M3平台,再到现在的Cortex M4平台,围绕CAN进行了一系列产品 ...

  6. 机器学习三剑客之matplotlib 数据绘图展示

    线型图: #导包 import matplotlib.pyplot as plt #导入字体库 from matplotlib.font_manager import FontProperties # ...

  7. numpy 多维数组及数组操作

    NumPy是Python语言的一个扩充程序库.支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库.Numpy内部解除了Python的PIL(全局解释器锁),运算效率极好,是大量机 ...

  8. ImageMagick - 设置透明带 AlphaChannel 的 png 图片的透明度

    学习和使用ImageMagick也有几年时间了,其实对 ImageMagick 的了解还仅仅是皮毛吧. 最近在写代码的时候,遇到一个调整透明png图片透明度的问题: 当1张png图片,有些区域是透明的 ...

  9. 第三十四节,目标检测之谷歌Object Detection API源码解析

    我们在第三十二节,使用谷歌Object Detection API进行目标检测.训练新的模型(使用VOC 2012数据集)那一节我们介绍了如何使用谷歌Object Detection API进行目标检 ...

  10. struts2 二: 参数封装

    封装请求正文到对象中(非常重要) 1.静态参数封装 在struts.xml配置文件中,给动作类注入值.调用的是setter方法. struts.xml的编写: <action name=&quo ...