`
karaschee
  • 浏览: 15274 次
  • 性别: Icon_minigender_1
  • 来自: 四川
社区版块
存档分类
最新评论

ECMAScript 等性运算符 和原始类型

阅读更多

1.关于类型

ECMAScript分为原始类型引用类型

5种原始类型:undefined null boolean number string,其余的都是引用类型。

 

undefined 类型只有一个值:undefined

值 undefined 并不同于未定义的值。但是,typeof 运算符并不真正区分这两种值。

那些定义了但是没有赋值的变量同样是undefined。

 

null 类型只有一个值:null

值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。

尽管这两个值相等,但它们的含义不同。undefined 是声明了变量但未对其初始化时赋予该变量的值,null 则用于表示尚未存在的对象(在讨论 typeof 运算符时,简单地介绍过这一点)。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。

 

- 注意 -

null是JS的关键字,无法用来作为变量的名字,而undefined既不是关键字也不是保留字,是可以用作变量名的。

其实目前大多数浏览器都会有一个叫undefined的全局变量,这个变量的值是undefined,类型也是undefined。很奇妙,不是吗?也可以说,是window的一个属性:window.undefined。

 

注意,一些老的浏览器是没有undefined全局变量的,可以手动讲undefined变量设为undefined值。

 

window.undefined = window.undefined;

 

在Jquery中,是在函数作用域中申明的undefined变量

 

(function($, undefined){
   js code...
})(jQuery); 
 

undefined 属性用于存放 JavaScript 的 undefined 值。

无法使用 for/in 循环来枚举 undefined 属性,也不能用 delete 运算符来删除它。

undefined 不是常量,可以把它设置为其他值。

当尝试读取不存在的对象属性时也会返回 undefined。

 

alert(undefined); //undefined
alert(typeof undefined); //undefined
undefined = 1;
alert(undefined); //undefined
 

 

typeof:


需要注意的是,对变量或值调用 typeof 运算符将返回下列值之一:

  • undefined - 如果变量是 Undefined 类型的
  • boolean - 如果变量是 Boolean 类型的
  • number - 如果变量是 Number 类型的
  • string - 如果变量是 String 类型的
  • object - 如果变量是一种引用类型或 Null 类型

- 注意 -

  1. 为什么 typeof 运算符对于 null 值会返回object ?这实际上是 JavaScript 最初实现中的一个错误,然后被 ECMAScript 沿用了。现在,null 被认为是对象的占位符,从而解释了这一矛盾,但从技术上来说,它仍然是原始值。
  2. 值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。
alert(typeof null);//object
 
alert(undefined == null);	        //true
alert(undefined === null);	//false

 

instanceof:

 

对于各种类型的定义有两种方法,比如:

var istrue = new Boolean();

var istrue = false;

对于原始类型来说,不同方法定义的变量,用instanceof得到的值是不同的。

 

而对于引用类型来说,比如:

var arr = [];

var arr = new Array();

用instanceof得到的值是相同的。这很好理解。

 

以下是一些例子:

		var arr1 = [];
		alert(arr1 instanceof Object);	//true
		alert(arr1 instanceof Array);	//true
		var arr2 = new Array();
		alert(arr2 instanceof Object);	//true
		alert(arr2 instanceof Array);	//true
		var obj1 = {};
		alert(obj1 instanceof Object);	//true
		var obj2 = new Object();
		alert(obj2 instanceof Object);	//true
		var fun1 = function(){};
		alert(fun1 instanceof Object);	//true
		alert(fun1 instanceof Function);//true
		
		//原始类型
		var num1 = 12;
		alert(num1 instanceof Object);	//false
		alert(num1 instanceof Number);	//false
		var num2 = new Number();
		alert(num2 instanceof Object);	//true
		alert(num2 instanceof Number);	//true
		var str1 = "1111";
		alert(str1 instanceof Object);	//false
		alert(str1 instanceof String);	//false
		var	str2 = new String();
		alert(str2 instanceof Object);	//true
		alert(str2 instanceof String);	//true
		var bl1 = true;
		alert(bl1 instanceof Object);	//false
		alert(bl1 instanceof Boolean);	//false
		var bl2 = new Boolean();
		alert(bl2 instanceof Object);	//true
		alert(bl2 instanceof Boolean);	//true
		
		//特殊
		var n = null;
		alert(n instanceof Object);		//false
		var u = undefined;
		alert(u instanceof Object);		//false
 

 

2.类型的比较

 

等号和非等号

 

在 ECMAScript 中,等号由双等号(==)表示,当且仅当两个运算数相等时,它返回 true。非等号由感叹号加等号(!=)表示,当且仅当两个运算数不相等时,它返回 true。为确定两个运算数是否相等,这两个运算符都会进行类型转换。

执行类型转换的规则如下:

  • 如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。
  • 如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字
  • 如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。
  • 如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。

在比较时,该运算符还遵守下列规则:

  • 值 null 和 undefined 相等。
  • 在检查相等性时,不能把 null 和 undefined 转换成其他值。
  • 如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。
  • 如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。

注意:

NaN不等于任何东西!像NaN>NaN这样的也是false,同样的还有undefinded >= null 也是 false

 

		null == undefined; 	//true
		"NaN" == NaN; 	//false
		5 == NaN; 	//false
		NaN == NaN; 	//false
		NaN != NaN; 	//true
		false == 0;	//true
		true == 1; 	//true
		true == 2; 	//false
		undefined == 0; 	//false
		null == 0; 	//false
		"5" == 5; 	//true
 
		var a={};
		var b=a;
		var c=a;
		alert(c==b);	//true
		alert(c===b);	//true
		alert(c==a);	//true
		c={};
		alert(c==b);	//false

 

全等号和非全等号

 

等号和非等号的同类运算符是全等号和非全等号。这两个运算符所做的与等号和非等号相同,只是它们在检查相等性前,不执行类型转换。

全等号由三个等号表示(===),只有在无需类型转换运算数就相等的情况下,才返回 true。

 

var sNum = "66";
var iNum = 66;
alert(sNum == iNum);	//输出 "true"
alert(sNum === iNum);	//输出 "false"

 

3.关于假值

  • 0 (Number)
  • NaN (Number)
  • null (Object)
  • undefined (Undefined)
  • "" (String)
  • false (Boolean)

以上值在判断的时候都会转换为flase.但他们之间并没等于关系。


4.一些补充

		alert(typeof(NaN));   
		 //Number
		alert(typeof(Infinity));  
		  //number
		alert(typeof(null));   
		  //object
		alert(typeof(undefined));   
		  //undefined
		alert(NaN==NaN);   
		  //false
		alert(NaN!=NaN);   
		  //true
		alert(NaN>NaN);    
		  //false
		alert(null==undefined);    
		  //true
		alert(null>=undefined);    
		  //false
		alert(null<=undefined);    
		  //false
		alert(null==null);  
		  //true
		alert(null!=null);   
		  //false
		alert(null!=NaN);   
		  //true
		alert(null==NaN);  
		  //false
		alert(NaN==undefined);   
		  //false
		alert(parseInt("123abc"));  
		  //123
		alert("123abc"-0);   
		  //NaN
		alert(Infinity>10);   
		  //true
		alert(Infinity>"abc");   
		  //false
		alert(Infinity==NaN);  
		  //false
		alert(true==1);   
		  //true
		alert(new String("abc")=="abc");   
		  //true
		alert(new String("abc")==="abc");   
		  //false
		alert(new Number("12")==12);   
		  //true
		alert(new Number("12")===12);   
		  //false
 
alert("0"==0);	//true
alert(""==0);	//true
//注意:按规则2,字符串与数字相比,将字符串转换为数字。从这里可以看出用的是Number("")的方法。
//详细请看parseInt,parseFloat,Number的区别
alert("0"=="");	//false
alert(false=="false");	//false
alert("0"==false);	//true
alert("\t\r\n"==0);	//true
 
		alert(!undefined);		//true
		alert(!null);		//true
		alert(!"");		//true
		alert(!0); 		//true
		
		alert(!NaN)		//true
		alert(!Infinity);	//false
 

 

alert(undefined == null) //true
alert(""==undefined);	//false
alert(""==false)	//true
alert(0==false)		//true
//引用规则:在检查相等性时,不能把 null 和 undefined 转换成其他值。只是在判断的时候作假值
alert(undefined==false)		//false
alert(null==false)		//false
alert(undefined==true)		//false
alert(null==true)		//false
alert(NaN !== NaN)		//true
分享到:
评论

相关推荐

    ECMAScript解读.doc

    ECMAScript 中的原始类型包括数字、字符串、布尔值、null、undefined 等。原始类型是不能被改变的值,具有不可变性。 2.6.1. typeof 运算符 typeof 运算符用于检测一个值的类型,例如数字、字符串、布尔值等。...

    《JavaScript高级程序设计》阅读笔记(二) ECMAScript中的原始类型

    ECMAScript定义了5种原始类型:Undefined、Null、Boolean、Number和String。这五种类型构成了ECMAScript数据类型系统的核心,是编程中处理最基础数据形态的基础。 首先,要掌握的是typeof运算符。typeof运算符用于...

    《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型

    综合这些信息,我们可以看到,ECMAScript中的引用类型为JavaScript提供了丰富的数据类型和操作方法,为编程提供了巨大的灵活性。开发者可以通过深入理解这些引用类型和运算符,编写更为高效和健壮的JavaScript代码。

    ECMAScript 6 入门(第三版 )

    13. **Symbol类型**:引入了一种新的原始数据类型,生成独一无二的标识符,避免了全局变量的冲突。 14. **尾调用优化**:在满足一定条件的情况下,编译器会对尾调用进行优化,消除递归中的额外栈帧,防止栈溢出。 ...

    JavaScript教程

    原始类型包括undefined、null、boolean、number和string。 - **类型转换**:了解ECMAScript如何处理不同类型之间的自动转换,以及如何进行显式类型转换。 #### 四、ECMAScript运算符 - **一元运算符**:介绍常见的...

    ECMAScript 基础知识

    它规定了浏览器等环境执行脚本语言的基础语法和数据类型等内容。ECMAScript 的设计灵感来源于多种编程语言,包括 Java、C 和 Perl 等,这使得开发者能够快速上手并灵活应用。 #### 二、ECMAScript的关键特性 #####...

    ECMAScript 2018快速入门 高清完整PDF

    本书分为13章,较为系统地介绍ECMAScript语言,内容包括变量与常量、表达式和运算符、字符串、数字和符号、数组和类型化数组、对象、函数、集合和映射、迭代器和生成器、Promise对象与异步函数、代理、类和模块,...

    JavaScript 高级教程

    原始类型包括Undefined、Null、Boolean、Number和String等,而引用类型则是指对象类型。 - **类型转换**:ECMAScript提供了自动和显式类型转换机制,了解这些转换规则对于避免编程中的常见错误非常有帮助。 #### ...

    Ecma-262.rar_ECMA-262_ECMAScript_javascript

    1. **基本语法**:变量声明(var, let, const)、数据类型(原始类型:Number, String, Boolean, Null, Undefined, Symbol, BigInt;引用类型:Object)、运算符(算术、比较、逻辑、位、赋值、条件、逗号)、流程...

    JavaScript 样式指南.zip

    Sass红宝石目录类型参考对象数组解构字符串功能箭头函数类和构造函数模块迭代器和生成器特性变量提升比较运算符和相等性区块控制语句评论空格逗号分号类型转换和强制命名约定访问器活动jQueryECMAScript 5 兼容性...

    JavaScript入门实例源码案例

    JavaScript的数据类型分为原始数据类型和引用数据类型。原始数据类型包括number、string、boolean、null和undefined五种。number类型包括整数、小数和NaN(不是数字的数字)。string类型是字符串类型。boolean类型有...

    javascript教程

    JavaScript支持多种数据类型,包括原始类型和引用类型。原始类型主要分为Undefined、Null、Boolean、Number和String五种。引用类型则包括了数组、对象等复杂结构。类型转换是编程中的一项基本操作,JavaScript提供了...

    ECMAScript6.zip_javascript

    - **展开运算符**:`...`运算符可用于数组和对象的展开,方便进行合并、复制等操作。 **10. 函数提升** - **函数声明现在不会提升到整个作用域的顶部,而是提升到当前块的顶部**,这使得代码更易于理解。 这些是...

    JavaScript知识点总结文档

    - **类型**:支持原始类型(如 number、string、boolean)和引用类型(如 object)。 - **语句**:if 语句、循环语句等控制流结构。 - **关键字**:定义了语言的关键组成部分,如 `var`、`function`、`return` 等。 ...

    TypeScript 语言规范 (英文PDF)

    比如介绍章节、环境声明、函数类型、对象类型、结构化子类型、上下文类型、类、模块、基本概念、语法规则、声明、作用域、类型系统(包括任意类型、原始类型、数字类型、布尔类型、字符串类型、空类型、未定义类型、...

    javascript高级程序设计_3资料.pdf

    字符串(String)在JavaScript中具有特殊性,是唯一没有固定大小的原始类型。所有原始类型(包括boolean、number和string)都有toString()方法,能够将它们的值转化为字符串。此外,parseInt()和parseFloat()用于将...

    understanding ecmascript 6 中文版

    - **Symbols 类型**:ES6 引入了一种新的原始数据类型——Symbols,用于唯一标识对象的属性键。例如:`let symbol = Symbol();` - **符号属性**:使用 Symbols 作为对象属性的键,可以避免属性名冲突。例如:`let ...

Global site tag (gtag.js) - Google Analytics