javascript 操作符小结
简单总结一下JavaScript的几个操作符: var、 in、 delete、 typeof、 new、 instanceof、void
var
定义变量要使用var操作符, 使用var操作符定义的变量将成为该变量的作用域中的局部变量。 也就是说,如果在函数中定义一个变量, 那么这个变量在函数退出后就会被销毁。
省略var操作符可以定义全局变量, 但是不推荐这样的做法。 因为在局部作用域中定义的全局变量很难维护。
有关作用域可以参考:变量、作用域和内存问题
in
in操作符有两种使用方式:for-in循环 及 单独使用。 单独使用的时候,如果 in操作符 能通过右侧的对象访问左侧给定的属性,无论该属性存在实例还是原型,返回true。
例1:
var a = 10;
if(a in window) {
alert(a); //"10"
}
例2:
function fn (){};
fn.prototype.a = function(){};
var fn1 = new fn();
alert("a" in fn1); // true
delete
delete可以删除对象属性或者数组元素。 当删除一个属性的时候, 这个属性将不再存在。 读取一个不存在的属性将返回 undefined , 但是可以通过in运算符来检测这个属性是否存在对象中。
例1:
var obj = {x: 1, y: 2};
delete obj.x;
alert(obj.x in obj); //false
var arr = [1,2,3];
delete arr[0];
alert(0 in arr); //false
alert(arr.length); //"3", 尽管删除了元素, 但是留下了一个“洞”, 数组的长度不变。
delete的操作数应该是一个 左值 ,如果它不是左值, 那么delete将不进行任何操作同时返回true; 如果delete删除成功或删除不存在的属性时, 会返回true。 然而并不是所有属性都可以删除,一些内置核心和客户端属性是 不能删除的, 用户通过var 语句声明的变量不能删除, 通过function语句定义的函数和函数参数也不能删除。
在ECMAScript 5严格模式中, 如果delete操作数是非法的, 将会抛出一个语法错误异常, 在非严格模式下, 只会简单的返回false不会报错。
例2:
var obj = {x: 1, y: 2};
delete obj.x; //true
"x" in obj; //false
delete obj.x; //删除不存在的属性, 返回true
delete obj; //不能删除通过var声明的变量, 返回false
//严格模式下,将抛出异常
delete 1; //不是左值, 返回true;
delete x; //试图删除它, 在非严格模式下返回 true;
//严格模式下,抛出异常
在JavaScript中,变量、对象属性、数组元素均是左值。
typeof
typeof操作符可以用来检测变量的类型,对一个值使用typeof可能返回下列某个字符串:
- “undefined” — 如果这个值未定义
- “boolean” — 如果这个值是布尔值
- “string” — 如果这个值是字符串
- “number” — 如果这个值是数值
- “object” — 如果这个值是对象或null
- “function” — 如果这个值是函数
从技术角度讲,函数在ECMAScript中是对象,不是一种数据类型。 然而,函数也确实有一些特殊的属性,因此通过typeof操作符来区分函数和其他对象是有必要的
要检测一个变量是不是基本数据类型,typeof操作符是最佳的工具。但在检测引用数据类型的值时,这个操作符的用处不大。 通常我们并不想知道某个值是对象,而是想知道它是什么类型的对象, 为此使用 instaceof操作符比较适合。 instanceof操作符在下边会有介绍。
关于数据类型的可以参考:变量、基本数据类型
new
new操作符用来创建实例。 任何函数,只要通过new操作符来调用,那它就可以作为构造函数;而任何函数,如果不通过new操作符来调用, 那它跟普通函数就没有什么两样。
使用new操作符调用构造函数实际上会经历一下4个步骤:
- 创建一个新对象
- 将构造函数的作用域赋给新对象(因此this就指向了这个新对象)
- 执行构造函数中的代码(为这个新对象添加属性)
- 返回新对象
instanceof
instanceof可以确定对象的类型,如果左侧的对象是右侧类型的实例(这个判断也会包括对“父类”的检测),那么instanceof操作符就会返回true。
例1:
var arr = new Array();
var reg = new RegExp();
alert(arr instanceof Array); //true
alert(reg instanceof RegExp); //true
alert(arr instanceof Object); //true
alert(reg instanceof Object); //true
根据规定,所有引用类型的值都是Object的实例。 因此,在检测一个引用类型值和Object构造函数时,instanceof操作符始终返回true。 如果用instanceof检测基本类型的值,始终会返回false, 因为基本类型不是对象。
例2:
function fn(){};
function fnSub() {};
fnSub.prototype = new fn();
var fn1 = new fnSub();
alert(fn1 instanceof Object); //true
alert(fn1 instanceof fn); //true
alert(fn1 instanceof fnSub); //true
在这个例子中,我们可以说fn1是Object、fn、fnSub任何一个类型的实例,因此测试这三个构造函数都返回了true。
void
void的操作数可以是任意值, 这个运算符不经常使用, 操作数会照常计算, 但忽略其计算结果并返回 undefined 。
void最常用在客户端URL — javascript:URL 中,让URL中可以写有副作用的表达式,而浏览器不必显示表达式的计算结果。
例1:
<a href="javascript:window.open()">click</a>
<a href="javascript:void window.open()">click</a>
例2:
<a href="#">click</a>
<a href="javascript:void #">click</a>
使用void操作符返回undefined, 所以点击过页面会定位在原来的位置。
通过添加 #+锚名称 至URL末端的方式访问锚点,假如浏览器找不到该锚点,就会定位到文档的顶端
javascript 操作符小结的更多相关文章
- javascript——操作符(~、&、|、^、<<、>>)
直接上代码吧! <script type="text/javascript"> //javascript操作符 //1.按位非~ var num1=25;// var ...
- javascript 操作符类型隐性转换
javascript 操作符类型隐性转换 (一).一元操作符只能操作一个值的操作符叫做一元操作符1.递增和递减操作符a. 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作 ...
- JavaScript操作符(一元操作符)
JavaScript操作符包括算术操作符.位操作符.关系操作符和相等操作符.只能操作一个值的操作符叫做一元操作符. 递增和递减操作符 递增和递减操作符有两个版本:前置型和后置型.前置型操作符位于要操作 ...
- JavaScript操作符汇总
操作符 JavaScript 有赋值.比较.算术.位.逻辑.字符串和特殊运算符.本章描述了操作符,以及关于操作符优先级的一些信息. 表 2.1 JavaScript 所有操作符简明列表. 表 2.1 ...
- JavaScript操作符-3---算数,逻辑,赋值,比较,三元
JavaScript操作符 学习目标 1.掌握什么是表达式 2.掌握javascript操作符的分类 3.掌握算数操作符 什么是表达式 将类型的数据(如常量.变量.函数等),用运算符号按一定的规则链接 ...
- JavaScript操作符(=?,)优先级
JavaScript操作符优先级: 关于最后3个运算符的优先级比较,下面通过一个实例来具体说明: var a,b,c; a = 3,4,5; b = a--,--a,a; c = a ? b++ : ...
- JavaScript 数据类型小结
数据类型对于机器而言,其意义在于更加合理的分配内存空间,而对于编程者而言,数据类型提供了我们相对应的一系列方法,对数据进行分析与处理. 在本文中,将对JavaScript数据类型的基础知识进行总结,全 ...
- JavaScript函数小结
JS基础知识 /********************** 1:基础知识 1 创建脚本块 1: <script language=”JavaScript”> 2: JavaScript ...
- JavaScript 操作符 变量
一.操作符: 一元操作符 递增操作符 递减操作符 分为 前置型(--a ++a) 和 后置型 (a-- a++) 区别如下: var a = 3,b=6; c = --a +b; //c= ...
随机推荐
- for循环中删除map中的元素,valgrind检测提示error:Invalid read of size 8
#include <iostream> #include <map> using namespace std; class A { public: typedef std::m ...
- GridView设置多个DatakeyNames
1.aspx页面GridView直接绑定DataKeyNames aspx设置: <asp:GridView ID="grvGrid" runat="server& ...
- Confluence 6 找到未使用的空间
有时候,你希望找到你系统中没有使用的内容.有时候你也希望能够对这些内容进行更多的关注,但是如何找到一些有关长期不更新的页面,或者长期不使用的空间? View Space Activity 页面中的内容 ...
- c语言代码风格2
1.注释 注释的目的是为了说明做了什么,而不是怎么做,所以注释表达应该准确而又简洁.注释要放在被注释内容的上方或右方.注释一般采用/*.........*/或//........ 对代码源文件和函数应 ...
- JSP分页1
分页 1.什么分页? 第N页/共M页 首页 上一页 1 2 3 4 5 6 7 8 9 10 下一页 尾页 口 go 分页的优点:只查询一页,不用查询所有页! 2.分页数据 页面的数据都是由Servl ...
- 关于MFC中重载函数是否调用基类相对应函数的问题
在重载CDialog的OnInitDialog()函数的时候,在首行会添加一句:CDialongEx::OnInitDialog();语句,这是为什么呢?什么时候添加,什么时候不添加? 实际上,我们在 ...
- UVA-11020(BST)
题意: 给n个点,一个点(x,y)有优势时满足不存在点(fx,fy)使得fx<x,fy<=y或fx<=x,fy<y;问当前有多少个有优势点; 思路: 学习BST的入门题,代码是 ...
- FFmpeg内存操作(三)内存转码器
相关博客列表 : FFMPEG内存操作(一) avio_reading.c 回调读取数据到内存解析 FFMPEG内存操作(二)从内存中读取数及数据格式的转换 FFmpeg内存操作(三)内存转码器 本文 ...
- bzoj 3232: 圈地游戏 01分数规划
题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3232 题解: 首先我们看到这道题让我们最优化一个分式. 所以我们应该自然而然地想到01分 ...
- JSONP -- 跨域数据交互协议
一.概念 ①传统Ajax:交互的数据格式——自定义字符串或XML描述: 跨域——通过服务器端代理解决. ②如今最优方案:使用JSON格式来传输数据,使用JSONP来跨域. ③JSON:一种数据交换格式 ...