你见过这些JavaScript的陷阱吗?

一、成员操作符

Number.prototype.testFn=function () {
    console.log(this<0, this.valueOf());
}
var num = -1;
num.testFn();  //true -1
(22).testFn();  //false 22
22.testFn();  //Uncaught SyntaxError: Invalid or unexpected token
(-1).testFn();  //true -1
-1..testFn();  //false 1
-1.2.testFn();  //false 1.2

点运算符会被优先识别为数字常量的一部分,然后才是对象属性访问符。

二、连等赋值

var a = {n: 1};
var b = a;
a.x = a = {n: 2};
console.log(a.x);  //undefined
console.log(b.x);  //{n: 2}

交换下连等赋值顺序a = a.x = {n: 2};可以发现结果不变,即顺序不影响结果。

三、强制转换

var aReg = /^[a-z]+$/;
aReg.test(null);  //true
aReg.test();  //true

test方法的参数如果不是字符串,会经过抽象ToString操作强制转成字符串,因此实际测试的是字符串 "null"和"undefined"。

四、传参

"1 2 3".replace(/\d/g, parseInt);  //"1 NaN 3"

实际进行计算的是[1, 0], [2, 2], [3, 4]

五、为什么给基础类型添加属性不报错但又无效?

var num = 1;
num.prop = 2;
num.prop   //undefined

num.prop等同于Object(num).prop,也就是说,我们添加属性到一个新建的对象上,与num没任何关系。

时间: 2024-08-10 12:01:35

你见过这些JavaScript的陷阱吗?的相关文章

JavaScript的陷阱

这本来是翻译Estelle Weyl的<15 JavaScript Gotchas>,里面介绍的都是在JavaScript编程实践中平时容易出错或需要注意的地方,并提供避开这些陷阱的方法,总体上讲,就是在认清事物本质的基础样要坚持好的编程习惯,其实这就是Douglas Crockford很久以前提出的JavaScript风格要素问题了,有些内容直接是相同的,具体请看<Javascript风格要素(1)>和<Javascript风格要素(2)>.在翻译的过程中,我又看到了

JavaScript 常见陷阱

JavaScript中的一些特性和通常我们想象的不太一样.这里我总结了一些有悖直觉的语言特性. 1 数组 1.1 数组的遍历 在直接支持for a in b的语言中,比方Python/Ruby里的a的值都是容器内保存的值.可是在JavaScript中.a仅仅代表属性.假设b是一个数组,则a就是索引(0-n),所以正确的使用for in 遍历数组的写法例如以下: var friends = ["Tom", "Jick", "Brandon"]; f

详解Javascript Function陷阱

Javascript Function无处不在,而且功能强大!通过Javascript函数可以让JS具有面向对象的一些特征,实现封装.继承等,也可以让代码得到复用.但事物都有两面性,Javascript函数有的时候也比较“任性”,你如果不了解它的“性情”,它很可能给你制造出一些意想不到的麻烦(bugs)出来. Javascript Function有两种类型: 1)函数声明(Function Declaration); // 函数声明 function funDeclaration(type){

javascript中陷阱

本文主要介绍怪异的Javascript,毋庸置疑,它绝对有怪异的一面.当软件开发者开始使用世界上使用最广泛的语言编写代码时,他们会在这个过 程中发现很多有趣的"特性".即便是老练的Javascript开发者也可以在本文找到一些有趣的新陷阱,请留意这些陷阱,当然也可以尽情享受由这些陷阱 带来的"乐趣"! 函数和操作符 双等号 ==操作符比较时会进行类型的强制转换,这意味着它可以比较两个不同类型的对象,在执行比较之前它将会尝试把这两个对象转换成同一个类型,举一个例子:

JavaScript的9个陷阱

来自Nine Javascript Gotchas, 以下是JavaScript容易犯错的九个陷阱.虽然不是什么很高深的技术问题,但注意一下,会使您的编程轻松些,即所谓make life easier. 笔者对某些陷阱会混杂一些评点. 1.最后一个逗号 如这段代码,注意最后一个逗号,按语言学角度来说应该是不错的(python的类似数据类型辞典dictionary就允许如此).IE会报语法错误,但语焉不详,你只能用人眼从几千行代码中扫描. <script> var theObj = { city

[Effective JavaScript 笔记] 第4条:原始类型优于封闭对象

js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //"number" typeof "s";//"string" typeof null;//"object":ECMAScript把null描述为独特的类型,但返回值却是对象类型,有点困惑. 可以使用Object.prototype.t

【JavaScript】纯粹javascript无任何插件的兼容IE6的模态框modal

模态框这东西在很多前端框架里面也是存在的,但是很多前端框架,如Bootstrap,AmazeUI,Jquery对IE6的兼容性极其糟糕,因此如果自己手写一个纯粹javascript无任何插件的的模态框,不仅能够兼容IE6,对其它浏览器很有很大的兼容性,同时,也好改. 一.基本目标 比如如下的模态框,怎么用在纯粹html+css+javascript,在无任何前端插件的情况下实现呢? 可以看到效果图,是在IETester的IE6模式中进行的,没有任何问题. 我还在这个模态框里面镶嵌了一个表单.反正

最烂编程语言得主:javascript

C++在我脑中一直是一门缺乏设计和远见的语言,其设计者也是缺少主见的人(我承认我对c++有一定偏见),在我看来,C++从一开始就是堆叠语言特性,成为最流行的语言,,只是这个时代将它推到了最前列,我心中最烂语言的地位很长时间内都是它稳坐的.知道有一天,我开始接触了javascript. 同样是语言,还从未曾见过比javascript更加混乱的,先天性的混乱.同样,也是这个时代的发展,互联网的浪潮,将它推向了最高峰,我作为一个无神论者+客观能力致胜的信奉者,在众多事实面前,终于不得不承认:终究是时势

Javascript 随机数函数 学习之二:产生服从正态分布随机数

一.为什么需要服从正态分布的随机函数 一般我们经常使用的随机数函数 Math.random() 产生的是服从均匀分布的随机数,能够模拟等概率出现的情况,例如 扔一个骰子,1到6点的概率应该相等,但现实生活中更多的随机现象是符合正态分布的,例如20岁成年人的体重分布等. 假如我们在制作一个游戏,要随机设定许许多多 NPC 的身高,如果还用Math.random(),生成从140 到 220 之间的数字,就会发现每个身高段的人数是一样多的,这是比较无趣的,这样的世界也与我们习惯不同,现实应该是特别高