- 浏览: 1060187 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (501)
- dwr (6)
- javascript (84)
- oracle (66)
- jsp/servlet (18)
- ant (3)
- 基础知识 (12)
- EXT (10)
- My SQL (10)
- java (71)
- spring (37)
- 学习的对象 (2)
- Linux (24)
- 面试 (1)
- HTML/CSS (11)
- tomcat (11)
- 收藏夹 (2)
- Power Designer (2)
- struts.xml配置文件 (1)
- sturts2 (3)
- myeclipse (8)
- eclipse (7)
- Maven (34)
- SVN (3)
- SAP JCO (2)
- JBOSS (11)
- webservice (8)
- word (1)
- 敏捷开发 (1)
- sybase (4)
- Nexus (3)
- EhCache (3)
- log4j (3)
- Cookie (4)
- Session (4)
- CXF (7)
- AXIS (2)
- SSO (1)
- LDAP (1)
- velocity (2)
- Jquery (5)
- redis (2)
- http (4)
- dojo (1)
- Linux资源监控软件mnon的安装与运用 (1)
- notepad++ (1)
- EA (1)
- UML (1)
- JasperReports (1)
- 权限 (0)
- freemarker (4)
- Spring MVC (1)
- JMS (1)
- activeMQ (1)
- hession (3)
- 安全 (1)
- ibatis (2)
- log (1)
- nginx (1)
最新评论
-
winhbb:
我刚好遇到了一个问题(在可以依赖注入的场合有效):有两个模块A ...
解决Maven项目相互依赖/循环依赖/双向依赖的问题 -
nanjiwubing123:
long3ok 写道你好 XmlOutputFormatter ...
用XStream转换复杂XML -
zhoujianboy:
另外一个方法实现eclipse tomcat 热部署:http ...
eclipse下实现maven项目在tomcat容器热部署方法 -
long3ok:
你好 XmlOutputFormatter 请问这个类是在什么 ...
用XStream转换复杂XML -
ganbo:
总结的好,文章给力。
解决Maven项目相互依赖/循环依赖/双向依赖的问题
S中有一个基本概念就是:
JavaScript中undefined==null
但undefined!==null
undefined与null转换成布尔值都是false
如果按照常规想法,比如下面的代码
var a=1; alert(Boolean(a));//返回true //那么下面的代码也应该返回true alert(1==true); //但肯定的,下面的代码会返回false alert(1===true);
但对于下面的代码,估计会让大部分JS程序员疑惑
Js代码
alert(123==true);//为什么返回false alert(Boolean(undefined));//outputs false alert(Boolean(null));//outputs false alert(undefined==false);//竟然返回false alert(null==false);//竟然也返回false
至于其原因,下面作一个尝试性的解析(是尝试性的解析)
首先看看JS中的==比较是如何比较的
对于标量,“==”直接比较其中的值就行了
而对于两个对象(这里特指除去原始值的对象……因为在JS可以说一切皆对象)
则是比较其引用
因此对于两个对象的比较,看它们是不是同一个对象,是不需要用===(严格相等,值相等且类型相同)的
再深入分析下JS对于标量应用==比较时的情况
对于相同类型的两个标量的比较,除了NaN比较特殊之外(NaN==NaN返回false),都没什么疑点
而对于类型不同的两个标量的比较,JS就有一套严格的规则,这规则JS解析引擎具体怎样执行的,抱歉,还没去看JS解析引擎的源代码呢,这里只好对其表现作个总结
1.将Boolean,Number,String这三种类型进行不同类型的==比较时,其规则是,总将两边的值转换成数字,再看看转换结果数字是否相等
如下代码
Js代码 alert(1==true);//true转换成数字也是1 alert('1'==true);//将字符串'1'与true都转换成数字 alert('abc'==true);//虽然字符串'abc'转换成布尔值是true,但这里会返回false //因为'abc'转换成数字是NaN,而true转换成数字是1 alert(123=='123');//同理,true
而undefined与null,它们是简单类型还是引用类型呢?
将上面的规则 应用于undefined与null时就不正确了,在解析之前,先看看==比较的其它形式
JS中简单类型与引用类型进行==比较的情况
这种比较与是有规则的,并且可以用代码来验证JS内部的执行情况
将一个简单类型(这里指除undefined与null的值)与一个对象比较时,
先调用对象的valueOf方法,以期待返回一个标量,如果对象的valueOf方法返回的仍然是一个复合对象的话
就接着调用对象的toString方法以期待返回一个标量,如果仍然没有返回标量的话,就判为不相等
如果valueOf或toString方法之一返回一个标量,就用这个标量同==另一边的标量进行比较
Js代码
var obj={}; alert(obj=="abc");//false obj.toString=function () { return 'abc'; }; alert(obj=='abc');//这时就返回true了 alert(obj==123);//false obj.valueOf=function () {return 123}; alert(obj==123);//true!!! obj.valueOf=undefined;//先将这个方法清空掉,以免受上面的代码影响 alert(obj==true);//false obj.valueOf=function () { return 1;//只要返回一个能转换成布尔值的标量就行了,1或true都行,都表示true }; alert(obj==true);//true!!!!
事实上还可以用下面的代码进行验证,将一个复合对象与标量进行比较时,总会先调用对象的valueOf,
valueOf方法返回不是一个标量的话还会接着调用toString方法
Js代码 var obj={ toString:function () { alert('valueOf方法没有返回标量,我会被调用'); }, valueOf:function () { alert('我先被调用,Object的valueOf方法默认实现是返回对象自身'); } }; alert(1==obj);//可以看到执行次序
那么讲了这么多,这和undefined!=false有什么关系呢?
JS中的==对两边的对象进行比较时,undefined将被转换成数字,也就是说,undefined被看成基本值
而又由于undefined转换成数字为NaN,所以将Number,String,Boolean这三种类型与undefined比较时,总是返回false
而对于null,JS则将其当成对象来比较,即尝试调用null的valueOf与toString方法,再将返回的结果与另一个值进行比较,可以推断null==false返回false的原因是因为null的valueOf实现导致的
由于null没有valueOf与toString方法,因此始终返回false
ECMAScript规范是怎么说的?
ECMAScript规范中指出,a与b进行比较,如果a与b是Number,String,Boolean这三种类型中的一种,
并且a与b的类型不同,那么就将a与b都转换成数字再进行比较
也就是说
Js代码 var a="true"; var b=true; alert(a==b); //结果等同于下面的代码 alert(Number(a)===Number(b));
而如果a是Number,String,Boolean这三种类型中的一种,而b是一个复合对象时(Object,Array等)
则对b执行ToPrimitive操作(这步是JS解释器执行的)
即
Js代码 var a="abc"; var b={}; alert(a==b); //上面的一行代码在JS解析时将被解释成 //a==ToPrimitive(b);
而这个ToPrimitive方法的实现,正是依次去调用对象的valueOf,toString方法,直到其中一个方法返回一个基本值
如果这两个方法没有返回基本值 ,那就认定不相等
而当a和b都是复合对象时,就很简单,就看a和b是不是同一个对象的引用!
而对于将undefined,null与其它类型进行比较的,则没具体说,只说了将
任何基本类型与Boolean类型比较时,会将其转换成数字(与前面的规则一样)
总结
Number,Boolean,String,Undefined这几种基本类型混合比较时,会将其转换成数字再进行比较
基本类型与复合对象进行比较时,会先将复合对象转换成基本类型(依次调用valueOf与toString方法)再进行比较
undefined被当成基本类型,undefined转换成数字是NaN,因此undefined与除null之外的其它类型值进行比较时始终返回false(注意NaN==NaN返回false)
null被当成复合对象,由于null没有valueOf与toString方法,因此和除了undefined之外的其它类型值进行比较时始终返回false
【转载地址】http://www.iteye.com/topic/696802
发表评论
-
JSONEditor
2015-07-08 20:11 555JSONEditor: https://github.com/ ... -
Javascript开发调试
2014-07-08 10:08 738小谈chrome调试命令:console.log的使用 h ... -
利用Script实现JSONP跨域
2014-01-24 09:38 9141.什么是跨域 我们经常会在页面上使用ajax请求访问其他服 ... -
jQuery JSONP 跨域实践
2013-12-12 18:24 681jQuery JSONP 跨域实践 一客户端(url:htt ... -
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2013-10-17 09:35 710预加载图片是提高用户体验的一个很好方法。图片预先加载到浏览器中 ... -
Js中escape(),encodeURI()和encodeURIComponent()使用和比较:
2013-09-12 09:42 1028Js中escape(),encodeURI()和encodeU ... -
If-Modified-Since & If-None-Match
2013-04-27 13:24 859If-Modified-Since & If-None ... -
为什么JS文件带参数 JS后带参数什么意思
2013-04-27 11:20 1339我们经常在页面里会看到在加载的js或css文件带时文件后面常常 ... -
js实现网页图片延时加载的原理和代码
2013-04-23 11:52 996有时我们看到一些大型网站,页面如果有很多图片的时候,当你滚动到 ... -
关于document.compatMode的一些介绍
2013-04-22 17:35 970对于document.compatMode,很多朋友可能都根我 ... -
js之事件冒泡和事件捕获
2013-04-20 10:03 1729事件——怎样使用事件以及IE和DOM事件模型之间存在哪些主要差 ... -
js中addEventListener中第3个参数 .
2013-04-19 16:33 1621捕获阶段、目标阶段、冒泡阶段 addEventListener ... -
超链接在web开发中使用总结
2013-04-02 14:33 1121在工作中在前端页面的 ... -
JavaScript Module Pattern: In-Depth
2013-03-27 11:47 975Module difinition: http://www.a ... -
JQuery移除事件
2013-01-30 13:00 931移除事件 unbind(type [,data]) ... -
Js 冒泡事件阻止
2013-01-29 09:27 9931. 事件目标 现在,事 ... -
查找所有嵌套iframe .
2013-01-28 10:19 114601.//查找所有嵌套iframevar allIfrs = ... -
什么是同源策略
2012-12-12 11:15 1135一.什么是同源策略 ... -
js 编码,使用java解码方式
2012-10-30 11:02 1628使用两个方法:decodeURIComponent和escap ... -
Cookies
2012-05-04 10:10 1036ookies Cookies 集合设置 coo ...
相关推荐
### JavaScript核心原理:深入理解对象与原型链 #### 前言 JavaScript 是一门高度抽象、面向对象的语言,广泛应用于Web开发中。它的核心特性之一就是处理对象(Object)的能力。对象不仅构成了JavaScript的基础数据...
JavaScript是一种广泛应用于Web开发的动态编程语言,它的工作原理基于弱数据类型,允许开发者创建复杂的对象来存储和处理数据。本文将深入探讨JavaScript的工作原理以及对象的详细概念。 首先,JavaScript中有两种...
### 理解JavaScript内存分配原理 #### 一、引言 在JavaScript编程中,内存管理是一个非常重要的概念。理解JavaScript如何处理内存分配对于优化代码性能、避免内存泄漏等问题至关重要。本文将详细介绍JavaScript中的...
### 理解Javascript原型继承原理 #### 一、引言 在JavaScript中,原型继承是一种非常核心且独特的机制,它使得对象能够继承其他对象的属性和方法。本文旨在深入探讨这一机制,并通过具体的示例代码帮助读者更好地...
在深入探讨JavaScript的基础深度原理之前,我们首先了解JavaScript的一些基本概念,这将有助于我们更好地理解和应用这些高级知识点。 #### 浏览器组成 浏览器是JavaScript运行的重要环境之一,了解其内部结构对于...
### JavaScript文件上传原理 #### 1. 文件选择 在网页上实现文件上传的第一步是让用户能够选择文件。这通常通过HTML中的`<input type="file">`元素实现。当用户点击该按钮时,会弹出一个文件选择对话框,允许用户...
JavaScript是一种广泛应用于网页和网络应用的脚本语言,它的运行原理独特,不同于传统的编译型语言。在JavaScript中,代码不需要预编译成字节码或机器码,而是直接在浏览器环境中解释执行。整个JS运行过程可以分为...
本文将详细介绍如何通过JavaScript调用OCX和COM组件,以及其实现原理和具体步骤。 #### 实现原理概述 JavaScript调用OCX或COM组件的基本原理在于利用了ActiveX技术。ActiveX控件是一种可复用的软件组件,通常用于...
漂浮广告,也被称为浮动广告或跟随广告,是网页设计中一种常见的营销手段,它以JavaScript为主要实现方式,能够在用户浏览网页时始终保持在屏幕的某一固定位置,吸引用户的注意力。这种广告形式通常会出现在页面的...
JavaScript JSON 使用原理与注意事项 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,它的设计灵感来源于JavaScript语法,但作为一个独立的标准,被广泛应用于各种编程语言中,包括JavaScript。...
本文将深入探讨JavaScript中的继承原理与用法,并通过实例进行讲解。 首先,JavaScript的对象由两部分组成:构造函数和原型。构造函数定义了对象的初始化方式,而原型则包含共享的属性和方法。在JavaScript中,每个...
JavaScript作用域原理是编程中的重要概念,它关乎变量的可见性、生命周期以及代码组织。本文将深入探讨JavaScript的作用域机制,特别是预编译的概念。在理解这些知识点之前,建议先回顾一下JavaScript的基础语法。 ...
这个话题涉及到的知识点包括基本的JavaScript编程、DOM操作、定时器、CSS动画以及物理学原理。 首先,了解自由落体的基本概念至关重要。在地球表面,物体在仅受重力作用下垂直向下运动的状态被称为自由落体。根据...
第二部分是 10个具体项目,每一章都会提出一个不同的应用,分析其内在的工作原理,然后提供能够提高读者技巧的练习。这些项目的范围从通用的小工具(可执行的计算器)到当代的各种创意(混搭),再到单纯的趣味性...
### JavaScript DOM 实现轮播图原理与实例 #### 原理分析 轮播图是一种常见的网页元素,用于展示多张图片或者广告等信息。它通过动态改变显示的图片来达到循环播放的效果。轮播图的基本原理是利用HTML、CSS以及...
贪吃蛇游戏的基本原理是玩家控制一条由多个方块组成的蛇,在一个有限的区域内移动。蛇吃到食物后会增长,而碰到边界或自己的身体会导致游戏结束。 ### 2. HTML布局 首先,我们需要一个简单的HTML页面作为游戏的...
在IT领域,特别是Web开发中,VBScrip与JavaScript互相调用是实现动态网页功能的重要技术之一。...然而,理解VBScript与JavaScript之间的交互原理对于深入学习Web开发历史和技术演进仍然具有重要意义。
书中详细解释了如何创建和使用对象,以及原型链的工作原理,这对于理解JavaScript中的继承机制和面向对象编程至关重要。此外,还涵盖了闭包和作用域的概念,这些都是JavaScript中高级特性的基础。 接着,书中的章节...