JavaScript中五种常见运算符
一. in运算符
in运算符希望它的左操作数是一个字符串或可以转换为字符串,希望它的右操作数是一个对象。如果右侧的对象拥有一个名为左操作数值的属性名,那么表达式返回true。例如:
var point = {x:1, y:1};
'x' in point //=>true:对象有一个名为'x'的属性
'z' in point //=>false:对象中不存在名为'z'的属性
'toString' in point //=>true:对象继承了toString()方法
var data = [7, 8, 9];
'0' in data //=>true:数组包含元素'0'
1 in data //=>true:数字转换为字符串
3 in data //=>false:没有索引为3的元素
注意:①当通过in判断一个字符串是否是一个对象的属性名时,这个判断也会包含对该对象继承属性的检测;
二. instanceof运算符
instanceof运算符希望左操作数是一个对象,右操作数标识对象的类。如果左侧对象是右侧类的实例,则表达式返回true,否则返回false。因为JavaScript中对象的类是通过初始化它们的构造函数来定义的,所以instanceof的右操作数应当是一个函数。例如:
var d = new Date(); //通过Date()构造函数来创建一个新对象
d instanceof Date; //=>true:d是由Date()创建的
d instanceof Object; //=>true:所有对象都是Object的实例
d instanceof Number; //=>false:计算结果为false,d不是一个Number对象 var a = [1, 2, 3];
a instanceof Array; //=>true:a是一个数组
a instanceof Object; //=>true:所有数组都是对象
a instanceof RegExp; //=>false:数组不是正则表达式 var b = 3;
b instanceof Number; //=>false:右操作数不是一个对象,只是一个原始值(切记这里不做类型转换:当右操作数是合法的函数时,只要右操作数是任何原始类型都会返回false)
注意:①所有对象都是Object的实例;②通过instanceof判断一个对象是否是一个类的实例的时候,这个判断也会包含对“父类”的检测;③如果instanceof的左操作数不是对象的话,instanceof返回false,如果右操作数不是函数,则抛出一个类型错误异常(先检测右操作数是否合法,再检测左操作数,最后判断表达式)。
三. typeof运算符
typeof是一元运算符,放在其单个操作数的前面,操作数可以是任意类型。返回值为表示操作数类型的一个字符串。下面是任意值在typeof运算后的返回值:
| x | typeof x |
| undefined | "undefined" |
| null | "object" |
| true或false | "boolean" |
| 任意数字或NaN | "number" |
| 任意字符串 | "string" |
| 任意函数 | "function" |
| 任意内置对象(非函数) | "object" |
| 任意宿主对象 | 有编译器各自实现的字符串,但不是"undefined"、"boolean"、"number"或"string" |
typeof运算符可以带上圆括号,这让typeof看起来像一个函数名,而不是一个运算符:typeof(i)
新增:关于instanceof和typeof,下面记述一个例子:

四. delete运算符
delete是一元操作符,它用来删除对象属性或者数组元素,当然它也有返回值。例如:
var o = {x:1, y:2};
delete o.x; //=>true:成功删除一个属性
'x' in o; //=>false:这个属性在对象中不再存在了
'y' in o; //=>true
o.x; //=>undefined:读取不存在的属性将返回undefined
delete o.x; //=>true:删除不存在的属性,返回true
delete o.z; //=>true:删除不存在的属性,返回true
var a = [1, 2, 3];
2 in a; //=>true:元素2在数组中
delete a[2]; //=>true:成功删除一个数组元素
2 in a; //=>false:元素2已经不在数组中了
a.length; //=>3:注意,数组长度并没有改变
delete a[3]; //=>true:删除不存在的元素,返回true
a[2]; //=>undefined:读取不存在的元素将返回undefined
var b = [1, 2, undefined];
2 in b; //=>true:元素2在数组b中
b[2]; //=>undefined:读取元素2的值,返回其值undefined
delete b[2]; //=>true:成功删除一个数组元素
2 in b; //=>false:元素2已经不再数组中了
b.length; //=>3:数组长度未变
b[2]; //=>undefined:读取不存在的元素返回undefined
可以看到:delete如果删除成功或者删除不存在的属性或元素时都会返回true,那么什么时候返回false呢?其实,并不是所有属性都可删除,一些内置核心和客户端属性是不能删除,用户通过var语句声明的变量不能删除(当用var声明全局变量时,这个变量也是全局对象window的一个属性),同样,通过function语句定义的函数和函数参数也不能删除。例如:
var o = {x:1, y:2};
var aa = 22;
delete o.x; //=>true
typeof o.x; //=>undefined
delete o; //=>false:不能删除通过var声明的变量,返回false
delete aa; //=>false:不能删除通过var声明的变量,返回false
delete window.aa; //=>false:无法删除
delete this.aa; //=>false:无法删除
function myTest(con){
console.log(delete con); //=>false:不能删除函数参数
console.log('myTest:' + con);
}
delete myTest;//=>false:不能删除通过function语句定义的函数
注意:在ECMAScript 5严格模式中,如果delete的操作数是非法的,比如变量、函数或函数参数,delete操作将抛出一个语法错误(Syntax Error)异常,只有操作数是一个属性访问表达式的时候它才会正常工作。在严格模式下,delete删除不可配置的属性时会抛出一个类型错误异常。在非严格模式下,这些delete操作都不会报错,只会简单地返回false,以表明操作数不能执行删除操作。当使用var声明一个变量时,创建的这个属性就是不可配置的,所以上面各种删除变量aa都返回false,表示无法删除,当然我们这里讨论的就是非严格模式嘛。在非严格模式中,如果给一个没有使用var声明的变量赋值的话,JavaScript会自动创建一个隐式的全局变量,以这种方式创建的变量是全局对象的正常的可配置属性,所以可以删除它们,Chrome运行结果也正是这样:


更要注意的一点是:在使用任务链进行部分var声明时,也会创建隐式全局变量,例如:

下面的例子更是验证了这个:

要想避免这种隐式全局变量,就要这样写:
var aa=0,bb=0;
delete aa;//=>false
delete bb;//=>false
还有一点就是:delete希望它的操作数是一个左值,如果它不是左值,那么delete将不进行任何操作同时返回true。例如:
delete 1; //数字1不是一个左值,返回true
五. void运算符
void是一元运算符,它出现在操作数之前,操作数可以是任意类型,操作数会照常计算,但永远返回undefined。例如:
var aa = 33;
var bb = 44;
var cc = 0;
var dd = void(aa+bb); //dd=undefined
var ee = void(cc = aa+bb); //ee=undefined,cc=77
//注意:最后一句不能写成var ee = void(cc = aa + bb;);,因为void一元运算符,后面是操作数,不能是完整的语句
JavaScript中五种常见运算符的更多相关文章
- javascript中五种常见的DOM方法
getElementById将返回一个与那个有着给定id属性值的元素节点对应的对象. <html xmlns="http://www.w3.org/1999/xhtml"&g ...
- javascript中五种基本数据类型
前言: JavaScript中有五种基本数据类型(也叫做简单数据类型)分别为:undefined.null.bolean.number.string:另外还含有一种复杂的数据类型:object. 深入 ...
- JavaScript 中 4 种常见的内存泄露陷阱
了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读一读吧 ...
- php中五种常见的设计模式
设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Gamma.Richard Helm.Ralph Johnson 和 John Vlissides Design(俗称 “四人帮”).所 ...
- JavaScript中几种常见的兼容问题及解决方案
在js中好用的东西一般都存在兼容问题,以下,我整理了一些常用的兼容处理方法,自己用的时候可以把他们放在一个JS文件中,需要用到时候直接引入,会比较方便. 一.获取非行内样式 function getS ...
- javascript中五种迭代方法实例
温习一下js中的迭代方法. <script type="text/javascript"> var arr = [1, 2, 3, 4, 5, 4, 3, 2, 1]; ...
- 五种常见的ASP.NET安全缺陷
保证应用程序的安全应当从编写第一行代码的时候开始做起,原因很简单,随着应用规模的发展,修补安全漏洞所需的代价也随之快速增长.根据IBM的系统科学协会(SystemsSciencesInstitute) ...
- Spring RestTemplate中几种常见的请求方式
https://github.com/lenve/SimpleSpringCloud/tree/master/RestTemplate在Spring Cloud中服务的发现与消费一文中,当我们从服务消 ...
- Spring RestTemplate中几种常见的请求方式GET请求 POST请求 PUT请求 DELETE请求
Spring RestTemplate中几种常见的请求方式 原文地址: https://blog.csdn.net/u012702547/article/details/77917939 版权声明 ...
随机推荐
- UVA - 10118Free Candies(记忆化搜索)
题目:UVA - 10118Free Candies(记忆化搜索) 题目大意:给你四堆糖果,每一个糖果都有颜色.每次你都仅仅能拿随意一堆最上面的糖果,放到自己的篮子里.假设有两个糖果颜色同样的话,就行 ...
- 15一个NoSql数据库
随着因特网web2.0该网站的兴起.非关系型数据库,现在已经成为一个非常受欢迎的新领域.非关系数据库产品的发展非常迅速.而在处理传统的关系数据库web2.0现场.特别是大规模,高并发SNS类型web2 ...
- iis10 HTTP 错误 500.19 - Internal Server Error
HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详细错误信息: 模块 IIS Web Core 通知 未知 ...
- 点击搜索取消UISearchDisplayController的搜索状态
一般,我们用到UISearchDisplayController的时候,都是须要对一个数据源进行刷选,在UISearchDisplayController自带的tableView中展示出来,然后点击退 ...
- redmine忘记username和password
环境: Ubuntu 13.10 bitnami-redmine-2.5.1-1-linux-x64-installer.run 用bitnami安装完redmine以后,有是否忘记了username ...
- 解决adb server is out of date. killing...问题
在运行 adb 命令时出现了例如以下提示: adb server is out of date. killing... 导致 adb 无法正常启动,更无法运行其它命令. 有问题怎么办?百度呗.查了查 ...
- w3wp与w3svc
如何找到w3wp与w3svc的对应关系 在生产环境中,一般会有多个IIS进程在运行,这里面可能是有Web Garden的设置,也可能是有多个application pool在运行.而我们经常在 ...
- Linux常见命令整理(一)
整理一下,以备后用 cd /home 进入/home文件夹 cd .. 返回上一级文件夹 cd ../.. 返回上两级文件夹 cd 进入个人的主文件夹 cd - 返回上次所在的文件夹 pwd 显 ...
- Statement和PreparedStatement的区别; 什么是SQL注入,怎么防止SQL注入? (转)
问题一:Statement和PreparedStatement的区别 先来说说,什么是java中的Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接 ...
- Spark SQL 源代码分析系列
从决定写Spark SQL文章的源代码分析,到现在一个月的时间,一个又一个几乎相同的结束很快,在这里也做了一个综合指数,方便阅读,下面是读取顺序 :) 第一章 Spark SQL源代码分析之核心流程 ...