javascript权威指南笔记--javascript语言核心(二)
1.函数作用域:在函数内声明的所有变量在函数体内始终是可见的。这意味着在变量声明之前甚至已经可用。
*“声明提前”:javascript函数里声明的所有变量(但不涉及赋值)都被提前至函数的顶部。
function test(o) {
var i = 0;
if(typeof(o) == "object") {
var j = 0;
for(var k=0; k<10; k++) {
console.log(k);//0-9
}
console.log(k);//10
}
console.log(j);//0
}
var scope="global";
function() {
console.log(scope);//undefined
var scope = "local";
console.log(scope);//"local"
}
因为函数内变量scope的声明被提前,相当于:
var scope = "global";
function(){
var scope;
console.log(scope);
scope = "local";
console.log(scope);
}
(function(){
testa();//testa
testb();//undefined is not a function
console.log(testd);//undefined
function testa(){//被提前到外部函数作用域顶部
console.log("testa");
}
var testb = function(){//变量的声明被提前,但赋值不会提前
console.log("testb");
}
var testd = "testd";//变量的声明被提前,但赋值不会提前
});
2.当使用var声明一个全局变量的时候,实际上定义了一个全局对象的属性,这个变量无法通过delete删除(该变量不可配置)。给一个未声明的变量赋值,javascript会自动创建一个全局变量,且该变量可配置(可删除)。
var truevar = 1;//声明一个不可删除的全局变量
fakevar = 2;//创建全局对象一个可删除的属性
this.fakevar2 = 3;//同fakevar
delete truevar;//false
delete fakevar;//true
delete fakevar2;//true
3.当javascript代码中出现了标识符,javascript会把它当成变量去查找它的值。变量名不存在,表达式的运算结果为undefined。
4.数组直接量的列表逗号之间的元素可以省略,这时省略的空位会被填充undefined,直接量的元素列表结尾处可以留下单个逗号,此时不会创建一个新的值为undefined的元素。
var matrix = [1,,,,3,]; 等价于 var matrix = [1,undefined,undefined,undefined,3];
5.一元操作符、赋值、三元条件运算符都具有从右至左的结核性。
6.b=(a++)+a;假设a等于1,b的运算结果为:3。
7.“+”运算符:如果其中一个操作数是对象,则将对象转换成原始值再进行操作。在进行了对象到原始值的转换之后,如果其中一个操作数是字符串,则进行字符串连接操作。否则将两个操作数都转换成数字进行加法操作。
1+2//3
"1"+"2"//"12"
"1"+2//"12"
1+{}//=>1+"[object Object]"=>"1[object Object]"对象转换成字符串后进行字符串连接
1+null//=>1+0=>0
1+undefined//=>1+NaN=>NaN
8.一元加法(+):一元加法运算符将操作符转换成数字(或NaN),并返回这个转换后的数字。
9.一元减法(-):一元减法运算符将操作符转换成数字(或NaN)再求负。
10.递增、递减(++,--):var i = 1; var j = i++;//i = 2,j=1
var i = 1;var j = ++i;//i=2,j=2
11.关系表达式:
(1).相等与不等运算符:==(相等) ===(严格相等) !=(不相等) !==(不严格相等)
(2).严格相等运算(===):首先计算其操作数的值,然后比较这两个值,过程中没有类型转换:
类型不同,不严格等;
null!==undefined;
同为true或false,严格相等;
NaN与其他任何值都不等,包括它本身;(通过x!==x来判断是否为NaN)
如果两个为数字且数值相等,则他们相等;(-0严格等于0)
如果两个引用值指向同一个对象、数组、函数,则他们严格相等;
如果两个字符串的长度或内容不同,则他们不严格相等。
(3).相等运算(==):如果两个操作数不是同一类型,则操作符尝试进行一些类型转换,然后再进行比较:
如果操作数的类型相同,则和严格相等的比较规则一样;
如果两个操作数类型不同,将和遵循如下规则和类型转换:
null==undefined;
字符串和数字进行比较,先将字符串转换成数字,再比较;
如果其中一个值是布尔值,则先将布尔值转成0或1,再比较;
如果一个值为对象,另外一个值是数字或字符串,则先将对象转换成原始值再进行比较;
其他不同类型之间的比较均不相等。
(4).比较运算符(>,<,>=,<=):比较数字的大小或字母表的先后顺序
如果两个操作数都是字符串,才比较字母表的先后顺序,否则转换成数字进行比较。
字符串的比较最好用String.localCompare()方法。
(5).in运算符:该运算符希望它的左操作数是一个字符串或可以转换成字符串,右操作数是一个对象。
var point = {x:1,y:2};
"x" in pont;//true
"z" in point;//false
"toString" in point;//true,对象继承了toString方法
var arr = [3,4,5];
"0" in arr;//true
1 in arr;//true,数字转换成字符串“1”
3 in arr;//没有索引为3的元素
(6).instanceof运算符:该操作符希望左操作数是一个对象,右操作数是标识对象的类。
如果左操作数不是一个对象,将返回false;如果右操作数不是函数,将抛出一个类型错误异常。
所有对象都是Object的实例。
12.逻辑表达式:
(1).&&逻辑与:首先计算左操作数。如果左操作数是假值,直接返回false,不去计算右操作数的值。如果左操作数是真值,那么“&&”将计算右操作数的值,并将其返回作为整个表达式的结果。
(2).||逻辑或:首先计算左操作数。如果左操作数是真值,则直接返回左操作数的值。否则再计算右操作数的值,并将其返回作为表达式的结果。
eg:function copy(o,p){//将o的成员属性复制到p中,并返回p
return p = p || {};//如果没有向参数p传入任何的对象,则使用一个新创建的对象
}
(3).!逻辑非:总返回true或false。将操作数转换成布尔值再对其求反。
13.赋值表达式:
(1).=:要求左操作数是一个变量或对象,右操作数可以是任意类型的任意值。结合性:从右至左。
x=y=z=0;//同时给x,y,z赋值为0
(2).+=,-=,*=,/=,&=:即a op= b;等价于a= a op b;前者计算一次,后者计算两次。只有在a包含具有副作用的表达式的时候,两者才不等价。
data[i++] *= 2;
data[i++] = data[i++] * 2;
(3).直接调用eval()其作用域是调用它的上下文作用域,eval()将改变该作用域内的变量。
当通过别名调用eval()时,其作用域是全局代码,eval()将改变全局变量的值,但不会改变局部变量的值。eval()内执行的代码可能定义新的全局变量或全局函数。
var x = "global";
var y = "global";
var geval = eval;
function f() {
var x = "local";
eval("x+='changed';");
return x;
}
function g() {
var y = "local";
geval("y+='changed';");
return y;
}
console.log(f(),x);//localchanged global
console.log(g(),y);//local globalchanged
14.其他运算符:
(1).条件运算符(?:),javascript中唯一一个三元运算符。
(2).typeof运算符:
typeof(undefined) => "undefined"
typeof(null) => "object"
typeof(true/false) => "boolean"
typeof(数字/NaN) => "number"
typeof(字符串) => "string"
typeof(函数) => "function"
typeof(内置对象(非函数)) => "object"
typeof(宿主对象) => 由编译器各自实现的字符串
(3).delete运算符:用来删除对象属性或数组元素。删除后并没有改变数组的长度,删除操作留下了一个“空洞”,再访问该属性、元素将返回一个undefined。
(4).void运算符:一元运算符,操作数会照常计算,但忽略计算结果,返回undefined。常见应用:
void 0 或 void(0)总是等于undefined;
<a href="javascript:void(0)"></a>可阻止链接的默认跳转行为;
<a href="javascript:void window.open(URL)"></a>//在新窗口打开URL,不会改变当前页面的内容
(5).逗号运算符(,)
javascript权威指南笔记--javascript语言核心(二)的更多相关文章
- javascript权威指南笔记--javascript语言核心(四)
对象: 通过引用(而非值)来操作对象: var obj = {"x":1,"y":2}; var copyObj = obj; copyObj.x = 5; c ...
- javascript权威指南笔记--javascript语言核心(一)
1.javascript的数据类型分为两类:原始类型和对象类型. 原始类型包括字符串.数字.布尔值.null.undefined. 对象是属性的集合,每个对象都由“名/值”对构成.数组和函数是特殊的对 ...
- javascript权威指南笔记--javascript语言核心(三)
1.var用来声明一个或多个变量.全局变量是全局对象的属性,它无法通过delete删除. 如果var语句中的变量没有指定初始化表达式,那么这个变量的初始值为undefined. 变量声明语句会被提前到 ...
- javascript权威指南笔记--javascript语言核心(六)
通过ECMAScript 3创建的属性都是可写的.可枚举的.可配置的. 在ECMAScript 5中,数据属性的4个特性分别是它的值.可写性.可枚举性.可配置性.存取器属性的特性是读取.写入.可枚举性 ...
- javascript权威指南笔记--javascript语言核心(五)--getter和setter属性
getter和setter属性: var p = { x:1.0, y:1.0, get r(){ return Math.sqrt(this.x*this.x + this.y * this.y); ...
- 1.语言概述-JavaScript权威指南笔记
上周三的时候交给老板目前的项目第一个迭代回顾会的总结.原本是以综述性的表述方式写的,交给他之后表示程序员不要长篇大论.总结要分为优点缺点期望等等块,每块列出条目,简明扼要的表达出来.这里也用这种风格. ...
- 2.语言概述-JavaScript权威指南笔记
上周三的时候交给老板目前的项目第一个迭代回顾会的总结.原本是以综述性的表述方式写的,交给他之后表示程序员不要长篇大论.总结要分为优点缺点期望等等块,每块列出条目,简明扼要的表达出来.这里也用这种风格. ...
- javascript权威指南笔记
最近每天工作之余看下js的细节部分,时间不是很多,所以看的进度也不会太快,写个博客监督自己每天都看下. 以前不知道的细节或者以前知道但是没注意过的地方都会记录下来,所以适合有一定基础的,不适合零基础新 ...
- 2.词法结构-JavaScript权威指南笔记
今天是第二章.所谓词法结构(lexical structure),就是写代码中最基本的东西,变量命名,注释,语句分隔等,这是抄书抄的... 1.字符集,必须是Unicode,反正Unicode是ASC ...
随机推荐
- 161116、springmvc自己实现防止表单重复提交(基于注解)
原理:在去某个页面直接生成一个随机数(这里使用的是UUID)并放入session中,用户提交表单时将这个随机数传入服务端与session中的值进行比较,如果不不存在或不相等,则认为是重复提交:如果相等 ...
- mysql主从同步及清除信息
主:reset master; 从:reset slave all; mysql主从配置: 1.MySQL主配置文件增加如下:default-storage-engine = innodbinnodb ...
- [转]Dynamics AX and Generic collections of .Net
转自:http://blogs.msdn.com/b/emeadaxsupport/archive/2009/04/23/dynamics-ax-and-generic-collections-of- ...
- 分布式拒绝服务攻击(DDoS)原理及防范
DDoS攻击概念 DoS的攻击方式有很多种,最基本的DoS攻击就是利用合理的服务请求来占用过多的服务资源,从而使合法用户无法得到服务的响应. DDoS攻击手段是在传统的DoS攻击基础之上产生的一类攻击 ...
- postgresql之distinct用法
1. 去重:关键字distinct去重功能 在其他数据库(oracle,mysql)是存在:当然postgresql也有这个功能 [postgres@sdserver40_210 ~]$ psql ...
- 《深度探索C++对象模型》3
第六章:执行期语意学 全局对象的初始化: 局部静态对象的初始化: 构建对象数组的vec_new()函数: 针对数组的new操作: placement operator new: 反聚合提高效率: 模板 ...
- 关于基于webrtc的android-apk 和 webrtc-brows
这一段时间我在做一些关于基于webrtc应用的一些研究,做个一个android的demo,详情如下: 手机客户端: 基于webrtc的 android apk (webrtc 代码版本 R67 ...
- Android动画之Interpolator和AnimationSet
AnimationSet可以加入Animation,加入之后设置AnimationSet对加入的所有Animation都有效. AnimationSet anim=new AnimationSet(t ...
- CaronteFX插件简介
CaronteFX是一个基于烘培的unity物理增强插件,而不是实时的. 也正因为如此可以在Cutscene中使用,而不用切到maya之类得到软件里去做,以提高效率 Adam demo里一些角色布料( ...
- Uva 10305 给任务排序
题目链接:https://uva.onlinejudge.org/external/103/10305.pdf 紫书P167 拓扑排序. dfs——从一个点出发,dfs 与之相连的所有点,把本身放入到 ...