一.子集
1.ECMAScript 3标准是1999年颁布的,2009年才更新到了ECMAScript5.js作者:Brendan Eich.
2.Firefox基于一个名叫Spidermondky的JavaScript引擎。Mozilla开发的另一个基于Java的引擎Rhino也支持大部分扩展特性。
3.安全性
(1)为了让js代码静态地通过安全检查,必须移除一些JS特性:
*eval()和Function()构造函数在任何安全子集里都是禁止使用的,因为它们可以执行任意代码,而且JS无法对这些代码做静态分析。
*禁止使用this关键字,因为函数可以通过this访问全局对象。而沙箱系统的一个重要目的就是阻止对全局对象的访问。
*禁止使用with语句,因为with语句增加了静态代码检查的难度。
*禁止使用某些全局变量。如window对象的引用。
*禁止使用某些属性和方法,以免在沙箱中的代码拥有过多的权限。包括arguments对象的两个属性caller和callee,函数的call()和apply()方法,以及constructor和prototype的两个属性。非标准的属性也被禁止掉了,如_proto_.
*静态分析可以有效防止带点的运算符的属性存取表达式去读写特性属性。无法对方括号内的煮字符串表达式做静态风险。
(2)安全子集的实现。
*ADsafe
是第一个正式提出的安全子集。
*dojox.secure
*Caja
Google发布的开源安全子集。更接近ES5的严格模式(不包含eval())。
*FBJS
*Microsoft Web Sandbox
有效地重新实现了一个安全的JS虚拟机,针对不安全的JS顶层代码进行处理。
二.常量和局部变量
1. JS1.5后可以使用const关键字定义常量。
const pi = 3.14; //定义一个常量并赋值
pi = 4; //任何对这个常量的重新赋值都被忽略
const pi = 4; //重新声明常量会报错
var pi = 4; //这里也会报错
2. JS的变量缺少块级作用域的支持被普遍认为是短板,JS1.7针对这个缺陷增加了关键字let。
三.解构赋值(混合式赋值)
1.//简单的解构赋值,数组
let [x,y] = [1,3]; //等价于 let x = 1,y=2
[x,y] = [x+1,y+1]; //等价于 x = x+1,y=y+1
[x,y] = [y,x]; //交换两个变量的值
2. "链式"解构赋值
let first,second,all;
all = [first,second] = [1,2,3,4]; //first = 1,second =2,all=[1,2,3,4]
3.let {sin:sin,cos:cos,tan:tan}=Math; //等价于 let sin = Math.sin,cos = Math.cos, tan = Math.tan。
四.迭代
(1)for/each循环,不建议对数组本身的元素进行遍历
//并不是遍历对象的属性,而是遍历属性的值
let o = {one:1,two:2,three:3}
for(let p in o) console.log(p); //for/in:输出'one','two','three'
for each(let v in o) console.log(v); //for/each:输出1-3
(2)迭代器
//返回一个可迭代的对象,用以表示该范围内的一个数字
function range(min,max){
return{
get min() {return min;}, //范围边界是固定的
get max() {return max;}, //并在闭包内保存起来
includes:function(x){
return min<=x && x<=max;
},
toString:function(){
return "["+min+","+max+"]"; //以字符串形式输出这个范围
},
_iterator_:function(){ //范围内的整数是可迭代的
let val = Math.ceil(min); //将当前位置保存在闭包中
return {
next:function(){
if(val>max){
throws StopIteration;
return val++; //否则返回下一个值,并自增1
}
};
}
};
}
for(let i in range(1,10)) console.log(i); //输出1-10之间的数字
//与解构并用
for(let [k,v] in Iterator({a:1,b:2}))
console.log(k+"="+v); //输出"a=1","b=2"
//Iterator()函数特性。第一,它只对自有属性进行遍历而忽略继承的属性;第二,如第二个参数true,返回迭代器只对属性名进行遍历,而忽略属性值。
o = {x:1,y:2};
Object.prototype.z = 3;
for(p in o) console.log(p); 输出"x","y"和"z"
for(p in Iterator(o,true)) console.log(p); //输出"x"和"y"
(3)生成器
//一个用以产生一个Fibonacci数列的生成器函数
function fibonacci(){
let x = 0,y=1;
while(true){
yield y;
[x,y] = [y,x+y];
}
}
//调用生成器函数以获得一个生成器
f = fibonacci();
//将生成器当做迭代器,输出Fibonacci数列的前10个数
for(let i = 0; i<10; i++) console.log(f.next());
f.close(); //和它相关的生成器函数终止执行。
(4)数组推导
let evensquares = [x*x for(x in range(0,10)) if(x%2===0)]
等价于
let evensquares=[];
for(x in range(0,10){
if(x % 2 ===0)
evensquares.push(x*x);
}
*语法:[ expression for(variable in object) if(condition)]
//将一个对象的属性名放入新创建的数组中
o = {a:1,b:2,f:function(){}};
let allkeys = [p for(p in o)];
let ownkeys = [p for(p in o) if(o.hasOwnProperty(p))];
let notfuncs = [k for ([k,v] in Iterator(o)) if(typeof v!=="function")]
(5)生成器表达式
JS1.8中,将数组推导中的方括号替换成圆括号,它就成了一个生成器表达式。
let lines = eachline(text);
let trimmed = (l.trim() for(l in lines));
五.函数简写
JS1.8引入:表达式闭包。关键字return和花括号都可以省略。
let succ = function(x)x+1,yes=function()true,no=function()false;
//对数组按照数字大小顺序进行降序排列
data.sort(function(a,b) b-a);
六.多catch从句
JS1.5就可以使用多catch从句了。
try{
//这里可能会抛出多种类型的异常
throw 1;
}catch(e if e instanceof ReferenceErro){
//这里处理引用错误
}catch(e if typeof e==="String"){
//处理字符串的情况
}catch(e){
//处理余下的情况
}finally{
//finally从句正常执行
}
七.E4X:ECMAScript for XML
是JS的一个标准扩展,它为处理XML文档定义了一系列强大的特性。Spidermondkey1.5和Rhin01.6已经支持E4X。更适用于服务器端编程。
JS_子集及扩展笔记
最新推荐文章于 2023-03-27 18:11:25 发布