JavaScript中调皮的undefined
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的更多相关文章
- JavaScript中Null和Undefined的深渊
探索JavaScript中Null和Undefined的深渊 当讨论JavaScript中的原始数据类型时,大多数人都知道的基本知识,从String,Number到Boolean.这些原始类型相当简单 ...
- JavaScript中null和undefined
JavaScript的数据类型大体分为两类:原始类型和对象类型.其中,原始类型包括数字.字符串和布尔值.此外,JavaScript中还有两个特殊的原始值:null(空)和undefined(未定义), ...
- 探索JavaScript中Null和Undefined的深渊
当讨论JavaScript中的原始数据类型时,大多数人都知道的基本知识,从String,Number到Boolean.这些原始类型相当简单,行为符合常识.但是,本文将更多聚焦独特的原始数据类型Null ...
- 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 ...
- javascript中typeof、undefined 和 null
typeof 是运算符,注意不是函数,是运算符,其作用,是考察变量究竟是什么类型.或曰,是变量是否定义或是否初始化的照妖镜.返回值是字符串. undefined 表示一个对象没有被定义或者没有被初始化 ...
- JavaScript中null和undefined的总结
先说null,它表示一个特殊值,常用来描述“空值”.对null执行typeof运算,结果返回字符串“object”,也就是说,可以将null认为是一个特殊的对象值,含义是“非对象”(感觉怪怪的).实际 ...
- JavaScript中Null和Undefined的区别
Null: null是js中的关键字,表示空值,null可以看作是object的一个特殊的值,如果一个object值为空,表示这个对象不是有效对象. Undefined: undefined不是js中 ...
- Javascript 中 null和undefined的区别
null表示"没有对象",即该处不应该有值.典型用法是: (1) 作为函数的参数,表示该函数的参数不是对象. (2) 作为对象原型链的终点. Object.getPrototype ...
- javascript中null与undefined的区别
1.null null是一个对象,表示一个空对象指针,typeof(null)返回object,null参与运算时会转化为0,将对象初始化为null,可以知道变量是否保存了对象的引用 2.undefi ...
随机推荐
- [SDOI2015] 寻宝游戏
传送门:>Here< 题意:给出一棵树(有边权),刚开始键值全部为0.每次对其中一个键值进行异或,问每一次修改之后:选择任意一个点出发走到所有为1的点再走回来的最短路 解题思路 由于N,M ...
- [USACO2008 Mar]土地购买
传送门:>HERE< 题意:购买一组土地的费用是最长的长乘以最长的宽.现给出n块土地,求购买所有土地(可以将土地分为任意组,不需按顺序)的最小费用 解题思路 动态规划+斜率优化 斜率优化在 ...
- 我的代码库-Java8实现FTP与SFTP文件上传下载
有网上的代码,也有自己的理解,代码备份 一般连接windows服务器使用FTP,连接linux服务器使用SFTP.linux都是通过SFTP上传文件,不需要额外安装,非要使用FTP的话,还得安装FTP ...
- ios-deploy was not found
Ionic 打包ios的时候,突然报错,提示如下: (node:1157) UnhandledPromiseRejectionWarning: ios-deploy was not found. Pl ...
- 安装 linux-dash
先看看软件的效果图,再介绍安装方法. 通过上图可以看到.软件可以实时监控CPU.内存.网络流量等相关信息,甚至可以监控到硬件信息安装方法:yum -y install httpd php zip un ...
- Windows server install mrtg
由于MRTG使用Perl语言编写 , 安装ActivePerl http://downloads.activestate.com/ActivePerl/releases/5.20.1.2000/Act ...
- 【agc030f】Permutation and Minimum(动态规划)
[agc030f]Permutation and Minimum(动态规划) 题面 atcoder 给定一个长度为\(2n\)的残缺的排列\(A\),定义\(b_i=min\{A_{2i-1},A_{ ...
- 「九省联考 2018」IIIDX 解题报告
「九省联考 2018」IIIDX 这什么鬼题,送的55分要拿稳,实测有60? 考虑把数值从大到小摆好,每个位置\(i\)维护一个\(f_i\),表示\(i\)左边比它大的(包括自己)还有几个数可以选 ...
- ACM-ICPC 2018 南京赛区网络预赛 J题Sum(线性筛素数)
题目链接:https://nanti.jisuanke.com/t/30999 参考自博客:https://kuangbin.github.io/2018/09/01/2018-ACM-ICPC-Na ...
- js 获取对象属性个数
js 获取对象属性个数 方法一: var attributeCount = function(obj) { var count = 0; for(var i in obj) { if(obj.hasO ...