Javascript (ECMAScript5) 的细节和违反直觉的地方
记录在学习Javascript (ECMAScript5) 中的一些与其他语言的不同之处,本文会不断更新。
里面的知识可能并不太适合有一定经验的Javascript程序员,仅仅但不限于给初学者阅读。
1. null 是一个表示“空”的对象指针
var foo = null
console.log(typeof foo) //输出 object 而不是你所认为的 null
2. undefined 是 null 派生而来的
console.log(null == undefined) //输出 true
3. 浮点数值计算误差问题
var a = 0.1
var b = 0.3
if (a+b == 0.3){
alert('OK') //然而a+b将会等于 0.300000000000000004
}
当然不仅仅只是ECMAscript有这种问题,很多使用相同数值类型的也有
4.NaN 不等于任何值,包括自身
NaN == NaN //false
NaN == "NaN" //false
NaN == 0 //false
//当然了你可以使用 isNaN 函数
5.for in 语句是没有顺序的代送
6.switch 可以是任何对象比较,不同与 C/C++ 或 Java 7 等里面不能字符串比较
7.所有函数的参数传参都是按值传的,哪怕传入的是对象,也会复制引用指针
function setName(obj){ //这个obj 是复制的引用指针,指向A
obj.name = 'OneName'
obj = new Object(); //B 但是现在你改变了这个复制的引用指针 指向B
obj.name = 'TwoName' //设置的仅仅是B
} var p = new Object() // A
setName(p)
alert(p.name) // 输出 OneName
8.Javascript 没有块级作用域(暂时不讨论闭包等)
你可能认为 两个{}大括号之间属于作用域区,这是Java的经验,然而在Javascript这点并没有得到实现
if (true){
var name = 'YouName' ;
}
alert(name); // 依然可以得到输出 YouName
for(var i=0;i<5;i++){
i++;
}
alert(i); //依然可以得到 变量 i
9.使用对象字面量表示法定义的对象,实际上将不会调用Object构造函数,推荐只用于只读的业务使用。
var p = {}; // 与 new Object() 得到的结果相同,但不会调用构造函数
p.name = 'YouName'; //依然可以想类一样操作 var obj = {
name: 'Name'
die: function(){//foo}
} //一样
10. 直接指向对象,而不是指向下一个引用
var A = function(){
alert('Run');
}
var C = A;
A = null; //链表的经验可能会告诉我们C将会失效指向null
C() //依然正常运行,不影响
11.谜一般的 this 指针究竟指向什么?
function func (A,B){
alert(this)
return A+B;
}
var A = 1;
var B = 2;
func(A,B); //调用函数 alert输出 window
//事实上这就相当于默认调用了 this值将会绑定到 global
func.call(window,A,B) //alert输出 window
func.call(undefined,A,B) //alert输出 undefined
func.apply(new Object(),[A,B]) //输出 Object
//这个第一项参数就是this值
在不同环境下执行函数将得到不同的this值,这里是全局环境,所以this绑定到全局global对象,所以直接调用将是window,如果你再其他环境下调用,那么就将是其他值了。
如果你这样,函数有所属对象时,this绑定到所属对象上去
var obj = new Object();
obj.fun = function(){ console.log(this); }
obj.fun(); //调用,此时this值将绑定到 obj 上面去,即this就是obj
所谓绑定,其实就是 function所有的bind() 函数。
var o = {color:'red'};
function sayColor()
{
console.log(this.color);
}
window.color='undefined'
var A = sayColor.bind(o); //一旦你这样显式的绑定了之后,不论环境怎么样,一定是你绑定的对象为this
A() //这里会输出 red 而不是 全局对象color的 undefined
让我们回到this主题:
情况一:普通的函数调用( func(A,B,C,D,....); ) this绑定到全局global 对象。
情况二:作为对象方法的调用 ( obj.func(A,B,C,...) ) this绑定到所附属的对象上。
情况三:作为构造函数调用(var obj = new YourObject()) this绑定到新构造出现的对象(obj)上。
情况四:显示绑定(bind apply call等) this绑定到你指定的对方。
12. 属性会覆盖掉原型的属性,当属性被删除之后,原型的属性又会重新恢复
Array.prototype.name = "A";
var obj = new Array();
obj.name //输出A
obj.name = "B"
obj.name//输出B
delete obj.name
obj.name //输出A 而不会是 undefined
13. 完全重写原型不会在现有的实例上体现
var A = function(){};
A.prototype = {
name:'YOU'
} var obj = new A();
obj.name // 输出 YOU //然后我们重写原型
A.prototype = {//这一次修改的原型将不会应用到已经实例化的原型中
name:'ME'
}
obj.name //依然 输出 YOU
Javascript (ECMAScript5) 的细节和违反直觉的地方的更多相关文章
- JS中让新手倍感震惊、违反直觉、出乎意料、的一些知识点汇总记录
本文记录在自己学习js过程中,违反直觉,出乎意料,倍感震惊的知识点.当然,不了解这个知识点,很容易出错,因为毕竟违反直觉,出乎意料,倍感震惊嘛! 1. 两个内容一样的数组竟然不相等? var a = ...
- Javascript一些小细节
1.判断class存在 $(obj).hasClass('BTCheck_ON') $obj.attr('class')=="BTCheck_ON" 有时我们判断样式存在会写成第二 ...
- javascript 备忘 细节 相关
DOMContentLoaded事件触发时机,即dom tree完成但页面未必渲染完毕. var a = [1,2,3,4]; var length = a.length; alert((leng ...
- 你可能还不知道的关于JavaScript类型的细节?
类型 七种类型: Undefined Null Boolean String Number Symbol Object Undefined.Null 阅读问题:为什么有的编程规范要求使用void 0 ...
- javascript EcmaScript5 新增对象之Object.freeze
我们都知道在js里对象是很容易改变的 var obj1 ={ a:'111' } obj1.a = '222'; console.log( obj.a ) //output 222 对象的属性发生了变 ...
- hahahah JavaScript 小小小细节
nice~!
- JavaScript 毒瘤和糟粕(需要注意的地方)
简介 我想这是在我总结JavaScript系列中最为需要注意的,最为重要的内容.你必须要去了解这些问题特性,才能准备好应对措施,这真的很重要. 毒瘤 全局变量 全局变量的存在的确是带来了方便,但是我觉 ...
- MySQL 5.7 学习:功能性能的提升
背景: 继上次介绍 初识 MySQL 5.6 新功能.参数完之后,刚好MySQL 5.7又GA了,在官方测试里看到,MySQL5.7在功能.性能.可用性.安全和监控上又提升了很高.现在看看和MySQL ...
- MySQL-版本及服务介绍
一.MySQL各版本 1.MySQL产品 下载地址:https://www.mysql.com/downloads/ Oracle MySQL Cloud Service(commercial) 商业 ...
随机推荐
- SpringBoot+Mybatis+Generator 逆向工程使用(二)
Mybatis-Genarator 逆向工程使用 个人开发环境 java环境:Jdk1.8.0_60 编译器:IntelliJ IDEA 2017.1.4 mysql驱动:mysql-connecto ...
- Storm框架:如何实现crontab定时任务
Storm除了能对消息流进行处理,还能实现crontab定时任务. 只要在bolt中配置TOPOLOGY_TICK_TUPLE_FREQ_SECS项即可实现. @Override public Map ...
- eclipse编译项目:Java @Override 注解报错的解决方法
错误: 在 eclipse 的新工作空间开发项目时,出现大面积方法编译错误.鼠标放在方法名上后显示让我们去掉 @override 注解,如图: 原因: @Override 是 jdk5 引入的机制,但 ...
- 哈夫曼编码(Huffman coding)的那些事,(编码技术介绍和程序实现)
前言 哈夫曼编码(Huffman coding)是一种可变长的前缀码.哈夫曼编码使用的算法是David A. Huffman还是在MIT的学生时提出的,并且在1952年发表了名为<A Metho ...
- ARM体系结构和汇编指令
第一节 可编程器件的编程原理 1. 可编程器件的特点 1 . CPU在固定频率的时钟控制下节奏运行 2 . CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行 3 . 这些可以被CPU解 ...
- 解决:在php配置文件路径下,添加php.ini之后,测试页面无法显示
安装完php之后,通常情况下,会在网站目录下创建一个.php的文件,来查看php安装过程中的参数配置,脚本的内容很简单: <? phpinfo(); ?> 通常情况下,如果能顺利安装下来不 ...
- JSPatch 可以让你用 JavaScript 书写原生 iOS APP
简介 JSPatch 可以让你用 JavaScript 书写原生 iOS APP.只需在项目引入极小的引擎,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,获得脚本 ...
- 报表使用hive数据源报java.net.SocketTimeoutException: Read timed out
数据库表的数据量大概50W左右,在报表设计器下创建了hive的数据源,连接正常,由于数据量比较大,就用了润乾报表的大数据报表功能,报表设置好后,发布到页面中报错: 数据集ds1中,SQL语句SELEC ...
- web 应用响应乱码问题
非西欧语系乱码原因 在没有设置任何内容类型或编码之前,HttpServletResponse使用的字符编码默认是ISO-8859-1.也就是说,如果直接输出中文,在浏览器上就会看到乱码. 有两种方式可 ...
- lodop 二维码内容多少
QRCode最多能放181个汉字:LODOP.ADD_PRINT_BARCODE(248,6,60,60,"QRCode","一二三四五六七八九十二二三四五六七八九十三二 ...