阅读更多

15顶
0踩

编程语言
本文由紫云飞翻译自《A Few New Things Coming To JavaScript》这篇文章。文中列举了一些将在下一代JavaScript中出现的令人兴奋的特性,译者还加上了自己的一些理解,非常值得一读。文章内容如下:


我相信,在ECMAScript.next到来的时候,我们现在每天都在写的JavaScript代码将会发生巨大的变化。2013年将会是令JavaScript开发者们兴奋的一年,越来越多的特性提案将被最终敲定,新一版本的JavaScript将会慢慢得到普及。

本文中,我将会讲几个我个人很期待的,希望能在2013年或者更晚一点使用上的新特性。

ES.next目前的实现情况

可以通过查看Juriy Zaytsev总结的ECMAScript 6兼容性表格,和Mozilla的ES6实现情况页面以及通过使用现代浏览器的最新版本(比如Chrome CanaryFirefox Aurora),来了解目前有哪些已经实现了的ES.next特性。

在Canary中,记得要进入chrome://flags打开“启用实验性JavaScript”选项以激活所有最新的的JavaScript特性。

另外,许多ES.next特性还可以通过使用Google的Traceur转换编译器(这里有一些单元测试的例子)来体验,以及一些shim项目比如ES6-ShimHarmony Collections,也实现了不少新特性。

在Node.js(V8)中使用--harmony命令行选项可以开启一些试验性质的ES.next特性,包括块级作用域,WeakMap等等。

模块

我们已经习惯了将我们的代码分割成为更加便于管理的功能块。在ES.next中,一个模块(module)是就是一个module声明,以及包含在该声明中的一组代码。模块可以用内联方式(inline)声明,也可以引入一个外部的模块文件。一个名为Car的内联模块的写法大致如下:

module Car {  
  // 导入 …  
  // 导出 …  
}  


一个模块实例就是一个被求过值的模块,它已经被链接到了其他的模块身上或者已经有了词法上的封装数据.下面是一个模块实例的例子:

module myCar at "car.js";  


module声明可以使用在如下上下文中:

module UniverseTest {};  
module Universe { module MilkyWay {} };  
module MilkyWay = 'Universe/MilkyWay';  
module SolarSystem = Universe.MilkyWay.SolarSystem;  
module MySystem = SolarSystem;  


一个export声明声明了一个可以被其他模块看到的局部函数或变量.

module Car {  
  // 内部变量
  var licensePlateNo = '556-343';  
  // 暴露到外部的变量和函数
  export function drive(speed, direction) {  
    console.log('details:', speed, direction);  
  }  
  export module engine{  
    export function check() { }  
  }  
  export var miles = 5000;  
  export var color = 'silver';  
};  


一个模块可以使用import导入任何它所需要的其他模块.导入模块会读取被导入模块的所有可导出数据(比如上面的drive(), miles等),但不能修改它们.导出的变量或函数可以被重命名.

再次用到上面导出相关的例子,我们现在可以有选择性的导入一些模块中的功能.

比如我们可以导入drive():

import drive from Car;  


还可以可以同时导入drive()和miles:

import {drive, miles} from Car;  


下面,我们要讲一下模块加载器API的概念.模块加载器能够让我们动态的加载所需要的脚本.类似于import, 我们可以使用被导入模块中的所有用export声明过的东西.

// Signature: load(moduleURL, callback, errorCallback)  
Loader.load('car.js', function(car) {  
  console.log(car.drive(500, 'north'));  
}, function(err) {  
  console.log('Error:' + err);  
});  
load()接受三个参数:


  • moduleURL: 表示一个模块URL的字符串 (比如 "car.js")
  • callback: 一个回调函数,接受模块加载,编译,以及执行后的输出结果
  • errorCallback: 一个回调函数,在加载或编译期间发生错误时调用

关于类(class)

我不打算在本文中过多的讲ES.next中的,如果你想知道类和模块将会有什么联系,Alex Russell曾经写过一个很好的例子来说明这件事.

JavaScript中有了类,并不意味着要把JavaScript变成Java.ES.next中的类只是我们已经熟悉的语义(比如函数,原型)的另外一种声明方式。

下面是用来定义一个widget的ES.next代码:

module widgets {  
  // ...  
  class DropDownButton extends Widget {  
    constructor(attributes) {  
      super(attributes);  
      this.buildUI();  
    }  
    buildUI() {  
      this.domNode.onclick = function(){  
        // ...  
      };  
    }  
  }  
}  


下面是去糖(de-sugared)后的做法,也就是我们目前正在使用的方法:

var widgets = (function(global) {  
  // ...  
  function DropDownButton(attributes) {  
    Widget.call(this, attributes);  
    this.buildUI();  
  }  
  DropDownButton.prototype = Object.create(Widget.prototype, {  
    constructor: { value: DropDownButton },  
    buildUI:     {  
      value: function(e) {  
        this.domNode.onclick = function(e) {  
          // ...  
        }  
      }  
    }  
  });  
})(this);  


ES.next的写法的确让代码变的更可读.这里的class也就相当于是function,至少是做了目前我们用function来做的一件事.如果你已经习惯并且也喜欢用JavaScript中的函数和原型,这种未来的语法糖也就不用在意了.

这些模块如何和AMD配合使用?

ES.next中的模块是朝着正确的方向走了一步吗?也许是吧.我自己的看法是:看相关的规范文档是一码事,实际上使用起来又是另一码事.在Harmonizr,Require HMTraceur中可以体验新的模块语法,你会非常容易的熟悉这些语法,该语法可能会觉得有点像Python的感觉(比如import语句).

我认为,如果一些功能有足够广泛的使用需求(比如模块),那么平台(也就是浏览器)就应该原生支持它们.而且,并不是只有我一个人这么觉得. James Burke,发明了AMD和RequireJS的人,也曾经说过:

我想,AMD和RequireJS应该被淘汰了.它们的确解决了一个实际存在的问题,但更理想的情况是,语言和运行环境应该内置类似的功能.模块的原生支持应该能够覆盖RequireJS 80%的使用需求,从这一点上说,我们不再需要使用任何用户态(userland)的模块加载库了,至少在浏览器中是这样.

不过James的质疑是ES.next的模块是否是一个足够好的解决方案,他曾在六月份谈到过自己关于ES.next中模块的一些想法 ES6 Modules: Suggestions for improvement以及再后来的一篇文章Why not AMD?.

Isaac Schlueter前段时间也写过一些自己的想法,讲到了ES6的模块有哪些不足.尝试一下下面这些选项,看看你的想法如何.

兼容目前引擎的Module实现


Object.observe()

通过Object.observe,我们可以观察指定的对象,并且在该对象被修改时得到通知.这种修改操作包括属性的添加,更新,删除以及重新配置.

属性观察是我们经常会在MVC框架中看到的行为,它是数据绑定的一个重要组件,AngularJS和Ember.js都有自己的解决方案.

这是一个非常重要的新功能,它不仅比目前所有框架的同类实现性能要好,而且还能更容易的观察纯原生对象.

// 一个简单的对象可以作为一个模块来使用  

var todoModel = {  
    label: 'Default',  
    completed: false  
};  
// 我们观察这个对象 

Object.observe(todoModel, function(changes) {  
    changes.forEach(function(change, i) {  
        console.log(change);  
        /* 
            哪个属性被改变了? change.name 
            改变类型是什么? change.type 
            新的属性值是什么? change.object[change.name] 
        */  
    });  
});  
// 使用时:
todoModel.label = 'Buy some more milk';  
/* 
    label属性被改变了
    改变类型是属性值更新
    当前属性值为'Buy some more milk' 
*/  
todoModel.completeBy = '01/01/2013';  
/* 
    completeBy属性被改变了
    改变类型是属性被添加
    当前属性值为'01/01/2013' 
*/  
delete todoModel.completed;  
/* 
    completed属性被改变了
    改变类型是属性被删除
    当前属性值为undefined 
*/  


Object.observe马上将会在Chrome Canary中实现(需要开启"启用实验性JavaScript"选项).

兼容目前引擎的Object.observe()实现


Rick Waldron的这篇文章有关于Object.observe更详细的介绍.(译者注:Firefox很早就有了一个类似的东西:Object.prototype.watch

默认参数值

默认参数值(Default parameter values)的作用是:在一些形参没有被显式传值的情况下,使用默认的初始化值来进行初始化.这就意味着我们不再需要写类似options = options || {};这样的语句了.

该语法形式就是把一个初始值赋值给对应的形参名:

function addTodo(caption = 'Do something') {  
    console.log(caption);  
}  
addTodo(); // Do something  


拥有默认参数值的形参只能放在形参列表的最右边:

function addTodo(caption, order = 4) {} 
function addTodo(caption = 'Do something', order = 4) {} 
function addTodo(caption, order = 10, other = this) {} 
已经实现该特性的浏览器: Firefox 18+(译者注:Firefox 15就已经实现了默认参数值,作者所说的18只是说18支持,并不是说18是第一个支持的版本.包括本文下面将要提到的chrome 24+等等,都有这个问题.)

块级作用域

块级作用域引入了两种新的声明形式,可以用它们定义一个只存在于某个语句块中的变量或常量.这两种新的声明关键字为:

  • let: 语法上非常类似于var, 但定义的变量只存在于当前的语句块中
  • const: 和let类似,但声明的是一个只读的常量

使用let代替var可以更容易的定义一个只在某个语句块中存在的局部变量,而不用担心它和函数体中其他部分的同名变量有冲突.在let语句内部用var声明的变量和在let语句外部用var声明的变量没什么差别,它们都拥有函数作用域,而不是块级作用域.

译者注:以防读者看不懂,我用一个例子解释一下上面的这句话,是这样的:

let(var1 = 1) {
    alert(var1);      //弹出1,var1是个块级作用域变量
    var var2 = 2;
}
var var3 = 3;
alert(var2);          //弹出2,虽然var2是在let语句内部声明的,但它仍然是个函数作用域内的变量,因为使用的是var声明
alert(var3);          //弹出3
alert(var1);          //抛出异常
var x = 8;  
var y = 0;  
let (x = x+10, y = 12) {  
  console.log(x+y); // 30  
}  
console.log(x + y); // 8  


实现let的浏览器: Firefox 18+, Chrome 24+

实现const的浏览器: Firefox 18+, Chrome 24+,  Safari 6+, WebKit, Opera 12+

译者注:Firefox很久以前就支持了letconst,但这两个旧的实现都是依据了当年的ES4草案.和目前的ES6草案有些区别,比如ES4中用const声明的常量并没有块级作用域(和var一样,只是值不可变),let也有一些细微差别,就不说了.由于很少人使用旧版的Firefox(但我的主浏览器是FF3.6!),即使未来ES6和ES4中的一些东西有冲突,我们基本也可以忽略.

Map

我想大部分读者已经熟悉了映射的概念,因为我们过去一直都是用纯对象来实现映射的.Map允许我们将一个值映射到一个唯一的键上,然后我们就可以通过这个键获取到对应的值,而不需要担心用普通对象实现映射时因原型继承而带来的问题.

使用set()方法,可以在map中添加一个新的键值对,使用get()方法,可以获取到所存储的值.Map对象还有其他三个方法:

  • has(key) : 一个布尔值,表明某个键是否存在于map中
  • delete(key) : 删除掉map中指定的键
  • size() : 返回map中键值对的个数
let m = new Map();  
m.set('todo', 'todo'.length);  // "todo" → 4  
m.get('todo');                 // 4  
m.has('todo');                 // true  
m.delete('todo');              // true  
m.has('todo');                 // false  


已经实现Map的浏览器: Firefox 18+

Nicholas Zakas的这篇文章有关于Map更详细的介绍.

兼容目前引擎的Map实现

译者注:尼古拉斯的这篇文章《[译]ECMAScript 6中的集合类型,第二部分:Map》中显示,10月份的ES6草案中,Map.prototype.size和Set.prototype.size都从size()方法改成size访问器属性了.同时Map对象新添加的方法还有很多,clear()用来清空一个map,forEach()用来遍历一个map,还有items(),keys(),values()等.Set对象也类似,有不少作者没提到的方法,下面的Set小节我就不指出了.)

另外,在ES5中,在把对象当成映射来使用的时候,为了防止原型继承带来的问题(比如在twitter中,@__proto__能让浏览器卡死),可以用var hash = Object.create(null)代替var hash = {};

Set

正如Nicholas Zakas在他的文章中所说,对于那些接触过Ruby和Python等其他语言的程序员来说,Set并不是什么新东西,但它的确是在JavaScript中一直都缺少的特性.

任何类型的数据都可以存储在一个set中,但每个值只能存储一次(不能重复).利用Set可以很方便的创建一个不包含任何重复值的有序列表.

  • add(value) – 向set中添加一个值.
  • delete(value) – 从set中删除value这个值.
  • has(value) – 返回一个布尔值,表明value这个值是否存在于这个set中.

let s = new Set([1, 2, 3]);  // s有1, 2, 3三个元素.  
s.has(-Infinity);            // false  
s.add(-Infinity);            // s有1, 2, 3, -Infinity四个元素.  
s.has(-Infinity);            // true  
s.delete(-Infinity);         // true  
s.has(-Infinity);            // false  


Set对象的一个作用是用来降低过滤操作(filter方法)的复杂度.比如:

function unique(array) {  
    var seen = new Set;  
    return array.filter(function (item) {  
        if (!seen.has(item)) {  
            seen.add(item);  
            return true;  
        }  
    });  
}  


这个利用Set来进行数组去重的函数的复杂度为O(n).而其他现有数组去重方法的复杂度几乎都为O(n^2).

已经实现Set的浏览器: Firefox 18, Chrome 24+.

Nicholas Zakas的这篇文章有关于Set更详细的介绍.

兼容目前引擎的Set实现

译者注:参考尼古拉斯的这篇文章:《[译]ECMAScript 6中的集合类型,第一部分:Set》,如果让我来实现一个ES6下的数组去重函数的话,我会这么写:

function unique(array) {   
    return [v for(v of Set(array))]
} 


该函数使用到了ES6中的for-of遍历,以及数组推导式.不过效率比上面使用filter去重的方法稍微差点.Firefox最新版中已经可以执行这个函数.

另外,借助于下面将会提到的Array.from方法,还有更简单高效的写法:

>Array.from(new Set([ 1, 1, 2, 2, 3, 4 ]));
[1,2,3,4]


甚至,借助于ES6中的展开(spread)操作,还有可能这样实现:

>[ ... new Set([ 1, 1, 2, 2, 3, 4 ]) ];
[1,2,3,4]



WeakMap

WeakMap的键只能是个对象值,而且该键持有了所引用对象的弱引用,以防止内存泄漏的问题.这就意味着,如果一个对象除了WeakMap的键以外没有任何其他的引用存在的话,垃圾回收器就会销毁这个对象.

WeakMap的另外一个特点是我们不能遍历它的键,而Map可以.

let m = new WeakMap();  
m.set('todo', 'todo'.length);  // 异常,键必须是个对象值!  
// TypeError: Invalid value used as weak map key  
m.has('todo');                 // 同样异常!  
// TypeError: Invalid value used as weak map key  
let wmk = {};  
m.set(wmk, 'thinger');  // wmk → 'thinger'  
m.get(wmk);             // 'thinger'  
m.has(wmk);             // true  
m.delete(wmk);          // true  
m.has(wmk);             // false  


已经实现WeakMap的浏览器: Firefox 18+, Chrome 24+.

兼容目前引擎的WeakMap实现


Nicholas Zakas的这篇文章有关于WeakMap更详细的介绍,或参考我的译文《[译]ECMAScript 6中的集合类型,第三部分:WeakMap

代理

代理(Proxy)API允许你创建一个属性值在运行期间动态计算的对象.还可以利用代理API"钩入"其他的对象,实现例如打印记录和赋值审核的功能.

var obj = {foo: "bar"};  
var proxyObj = Proxy.create({  
  get: function(obj, propertyName) {  
    return 'Hey, '+ propertyName;  
  }  
});  
console.log(proxyObj.Alex); // "Hey, Alex"  


可以看看Nicholas Zakas的这篇文章这个例子.

实现代理API的浏览器: Firefox 18+, Chrome 24+

译者注:作者不知道的是,一共有过两个代理API的提案,一个是旧的Catch-all Proxies,一个是新的直接代理(Direct Proxies).前者已被废弃.两者的区别在这里.V8(Chrome和Node.js)实现的是前者,Firefox18及之后版本实现的是后者(17及之前版本实现的是前者).尼古拉斯在2011年写的文章也应该是过时的.

一些新的API

Object.is

Object.is是一个用来比较两个值是否相等的函数.该函数和===最主要的区别是在对待特殊值NaN与自身以及正零与负零之间的比较上.Object.is的判断结果是:NaN与另外一个NaN是相等的,以及+0和-0是不等的.

Object.is(0, -0); // false  
Object.is(NaN, NaN); // true  
0 === -0; // true  
NaN === NaN; // false  


实现了Object.is的浏览器: Chrome 24+

兼容目前引擎的Object.is实现


译者注:Object.is方法和严格相等===运算符的区别体现在ES标准内部就是SameValue算法严格相等比较算法的区别.如果我没有理解错这条BE的推特的话,Object.is要改名成为Object.sameValue了.

Array.from

Array.from: 将参数中的类数组(array-like)对象(比如arguments, NodeList, DOMTokenList (classList属性就是这个类型), NamedNodeMap (attributes属性就是这个类型))转换成数组并返回,比如转换一个纯对象:

Array.from({  
    0: 'Buy some milk',  
    1: 'Go running',  
    2: 'Pick up birthday gifts',  
    length: 3  
});  


再比如转换一个DOM节点集合:

var divs = document.querySelectorAll('div');  
Array.from(divs);  
// [<div class="some classes" data-info="12"></div>, <div data-info="10"></div>]  
Array.from(divs).forEach(function(node) {  
    console.log(node);  
});  


兼容目前引擎的Array.from实现


译者注:从作者举的两个例子可以看出,Array.from基本相当于目前使用的[].prototype.slice.call.
目前的草案也的确是这样规定的,但从Rick Waldron(TC39成员)在原文评论中给出的代码可以看出,也许Array.from未来也能将Set对象(非类数组对象,但可迭代)转换成数组.


译者注:除了这两个API,还有很多个新添加的API,比如Number.isFiniteisNaNisIntegertoInteger、String.prototype.repeatstartsWith、endsWith、contains、toArray

下面给出两个很有用的链接:

总结

ES.next中添加了许多被认为是JavaScript中缺失已久的新特性.虽然ES6规范计划在2013年年底发布,不过浏览器们已经开始实现其中的一些特性了,这些特性被广泛使用也只是时间问题了.

在ES6完全实现之前,我们可以使用一些转换编译器(transpiler)或者shim来体验其中一些特性.

译者注:目前最强大的ES6实现应该是Brandon Benvie写的continuum(见《Continuum:基于JavaScript的ES6虚拟机》),这是一个JavaScript虚拟机,也就是用JavaScript(ES3)实现的JavaScript(ES6)引擎,它未来甚至可以工作在IE6上.目前实现的ES6特性有:模块以及模块加载器API,直接代理,生成器,解构,@symbols等等.

想要查看更多的例子和了解最新的信息,可以去TC39 Codex Wiki,该站点由Dave Herman和其他一些EC39成员维护(译者注:该新站仍在建设中,应该访问旧站).其中包含了下一代JavaScript中将要有的所有新特性.

激动人心的时刻马上就要到来了!

译者注:文本中提到的知识点仅仅是ES6中新知识的一小部分,而且明显作者自己也有点赶不上草案的快速变化(本文中提到的所有知识点都有可能在明天就发生变化).所以本文的内容仅仅是个开始,原文中的外部连接加上我给出的外部链接才是最需要你关注的。
  • 大小: 49.8 KB
15
0
评论 共 18 条 请登录后发表评论
18 楼 mangguo 2015-04-15 11:04
现在JavaScript发展越来越好了,像现在的nodejs可以让JavaScript运行到后端。
汇智网、花瓣网和BAT中都用到了nodejs。真心希望JavaScript发展越来越好。
17 楼 liangxianfu5811 2013-01-13 20:10
没看出有什么理由可以称为下一代
16 楼 clxy 2013-01-13 16:57
这些人啊,只知道添加“新”特性。

真正需要的是“整理”才对。就是说除了一味的添加“新”的,还需要大刀阔斧的整理“旧”的 —— 比如删除那些过时的;增强那些已有的;合并些类似的等等。
(如果说兼容会成为问题的话,要我说如果是问题永远是问题比如IE大爷!)

一味增加,只会越来越臃肿,越来越混乱。

拿比较来说,已经有“==”和“===”,现在又要加上is(sameValue)?!
您说这不整个就是吃饱了撑的?!哈!

然后呢,像是java里的equals方法这样需要自定义对象的比较逻辑呢?大家还得自己写自己的,没个统一的抽象接口,对吧?!

添加新特性是改善,但绝不等于改善!

我个人对Javascript期望很大,希望它能“千秋万载 一统江湖”什么的,哈!
瞧他们这架势,有些悬......
15 楼 Troland 2013-01-12 09:53
很超前。。都向后端靠拢了。。
14 楼 xyang81 2013-01-10 12:43
语法更接近面向对象了....爽!!!!
13 楼 musicbox95351 2013-01-10 11:01
个人一点看法。当然我对其底层实现一无所知。
1 模块就是类似包的概念吧?为什么不吸收其它语言的成功得不能再成功的经验呢?ActionScript和Js同样基于ECMAScript标准,为什么AS没有别出心裁的将package这个一目了然的关键字改成别的什么玩意?由于js脚本语言的动态执行的灵活性,编译器有时候根本无法找到某些变量的引用。使得各个js框架间无法很好的复用。也因为灵活性的原因JS的IDE环境起不了太大作用。可以说js的动态执行是我很喜欢的特性。
2 关于export我的理解就是public.为什么不就用public呢?
3 新特性中加入了extends 关键字。这一支持面向对象语言特性之一“继承”的关键字终于出现了。虽然目前的一些js框架都可以实现自己的继承机制,但是一个支持面向对象的语言本身就应该拥有这个基本关键字。
4 默认参数值这种东西在AS中也有。不过用处不是太大。
5 对于事件的增强支持将使js成为更好的界面处理脚本语言。结合HTML和浏览器的革命将给网页带来无需flash的革命性改变。
12 楼 xuershan 2013-01-08 10:46
浏览器兼容性就是个悲剧。
11 楼 air_fans 2013-01-08 09:49
10 楼 rainsilence 2013-01-07 17:37
module这一栏在英文网站上被划掉了。。。。
9 楼 danny.chiu 2013-01-07 10:33
xuanziday 写道
moudle的语法看着就让人不爽, 还不如cmd或者amd。

js本来就是大众化的语言,某些人非要把它搞成高富帅,没有意义。模块化支持倒是挺好的,但现有的框架也不错,SeaJs、RequireJs
8 楼 xuanziday 2013-01-07 10:06
moudle的语法看着就让人不爽, 还不如cmd或者amd。
7 楼 danny.chiu 2013-01-07 09:54
bolo 写道
这到底是js的进步还是倒退?

同问!在走失败的ES5的老路子
6 楼 lazy_ 2013-01-07 09:12
除了module和observe之外,其他看起来意义不大,特别是Class关键字,个人还是觉得不应该加上去,这样只会让js的原型继承更难让人得知和理解。
5 楼 gxm2052 2013-01-07 09:09
感觉现在js已经够用了。
4 楼 bolo 2013-01-07 09:06
这到底是js的进步还是倒退?
3 楼 zssggg 2013-01-06 21:48
没看懂!
2 楼 dsjt 2013-01-06 17:36
哇塞,语法更复杂了!
1 楼 yyc_it 2013-01-06 17:29
目测偷师scheme 的说。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 数据验证JS脚本(手机号码、固定电话、邮政编码、数字验证、两位小数、邮箱、身份证号码等).rar

    数据验证JS脚本(手机号码、固定电话、邮政编码、数字验证、两位小数、邮箱、身份证号码等).rar

  • shell练习<3>

    题目描述 给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个单行 bash 脚本输出所有有效的电话号码。 你可以假设一个有效的电话号码必须满足以下两种格式: (xxx) xxx-xxxx 或 xxx-xxx-xxxx。(x 表示一个数字) 你也可以假设每行前后没有多余的空格字符。 示例 假设 file.txt 内容如下: 987-123-4567 123 456 7890 (123) 456-7890 你的脚本应当输出下列有效的电话号码: 987-123-4567

  • 常见正则表达式总结

    每次要使用的时候都要去查资料,太多了根本记不住,这里我把资料的总结拿出来了,希望能帮上忙。

  • 正则系列之手机号码正则

    手机号码正则

  • 手机号码的正则表达式

    手机号码的正则表达式可以是这样的: ^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\d{8}$ 这个正则表达式可以匹配大多数中国大陆的手机号码,包括 13、14、15、17、18 开头的手机号码,以及 166、198、199 开头的虚拟运营商的手机号码。 你可以在程序中使用这个正则表达式来...

  • 手机号验证最新正则表达式

    一般表单页面都需要填写手机号,校验用户输入的手机号码是否正确,就要用到正则表达式,用正则表达式来匹配手机号段,如在运营商号段内,则号码正确。因此,需要知道运营商最新的号段,如下所示: 各大运营商手机号码段(新) 中国电信号段 133、153、173、177、180、181、189、190、191、193、199 中国联通号段 130、131、132、145、155、156、166、167、171、175、176、185、186、196 中国移动号段 134(0-8)、135、136、137、138

  • 手机号正则表达式

    国内手机正则表达式。

  • 浮点数正则表达式_正则表达式的邮箱,手机号,身份证号,密码

    一、校验数字的表达式数字:^[0-9]*$n位的数字:^d{n}$至少n位的数字:^d{n,}$m-n位的数字:^d{m,n}$零和非零开头的数字:^(0|[1-9][0-9]*)$非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$带1-2位小数的正数或负数:^(-)?d+(.d{1,2})$正数、负数、和小数:^(-|+)?d+(.d+)?$有两位小数的...

  • 手机号码正则表达式

    手机号码正则表达式验证 1. function checkPhone(){ var phone = document.getElementById('phone').value; if(!(/^1[3456789]\d{9}$/.test(phone))){ alert("手机号码有误,请重填"); return false; ...

  • 正则表达式——手机号码

    该方法从字符串的起始位置开始匹配正则表达式,如果匹配成功,则返回一个匹配对象;如果匹配失败,则返回 None。其中,\d 代表一个数字字符,{9} 表示前面的模式(即 \d)应重复9次。这个正则表达式可以用来检测一个字符串是否为一个符合特定格式的中国手机号码。在Python中,re.match() 是一个用于正则表达式匹配的方法。当你在字符串前面加上r或R,它会确保字符串中的所有字符都是原始的,[34578]:匹配方括号内的任意一个数字,即。\d{9}:匹配9个数字(3、4、5、7 或 8。

  • 提交表单的检查代码

    function FormCheck() { if (document.Form1.user.value =="") { alert("请填写您的用户名!"); document.Form1.user.focus(); return false; } var filter=/^\s*[.A-Za-z0-9_-]{5,15}\s*$/; if (!filter.test(document.Form1

  • 【数据构造】手机号码并发生成

    在性能测试时,涉及到注册等需要手机号码的接口,且此手机号码不能重复以及在数据库中已存在,通过什么方式可以解决这个问题? 方案一 通过另外一个接口将创建信息注销或删除 如:注册接口可通过注销的方式将该手机号码 优点: 号码可重复使用 缺点: 需要额外增加另外一个接口 数据库中业务可能注 销接口仅仅将is_delete的状态置为1,导致实际的请求和业务场景不一致 方案二 通过数据库操作将已...

  • python实现手机号获取短信验证码 | 对接打码平台

    前言 本篇文章主要讲了如何利用python自动注册网站(自动识别验证码) ID在用户中心最下面的软件ID里获取 识别类型在“价格体系”中查看 首先需要花1块钱到超级鹰打码平台上买点题分(1块钱1000提分,可以打100次) 超级鹰官网http://www.chaojiying.com 主要文件.py import time import requests from chaojiying import Chaojiying_Client #调用chaojiying.py文件中的函数 """如果请求的网

  • 基于python3的手机号生成脚本

    今天利用业余,自己突发想法来写个手机号码生成的脚本,其实自己用的方法很简单,想必肯定又不少人写的比我的好,我只是自己闲来无聊搞一下, #作者:雷子 #qq:952943386 #日期:2016年7月19日 import random def suiji(): list=['134','(移动:)135','(移动)136','(移动)137','(移动)138','(移...

  • android之简单好用的本地生成验证码并进行验证

    在APP上进行登录时,为了防止恶意的频繁登录,有时需要先进行验证码验证,然后再进行登录。目前主流的验证时通过手机获取验证码进行验证,但这样需要绑定手机及个性信息,而有些是不需要通过手机,只需本地生成验证就好,今天的这个就是使用本地生成的验证码。

  • 短信验证码字典脚本

    f = open('/Users/superzedlv/Desktop/yanzhengma.txt','w') start = 0000 end = 10000 print len(str(end)) b = '' #line = f.readline() for i in range(start,end): if len(str(i))==3: b = '0'+str(...

  • 自动化测试-自动获取手机短信验证码

    最近在测试APP端,准备编写自动化测试脚本,但是在编写注册脚本时,遇到了一个难题-如何获取手机短信验证码。 通过百度,了解到一种方法,做一个apk小程序,将手机上的短信验证码实时读取出来,存储到手机sd卡的一份文件里,再通过python读取文件内容就可以了。我也尝试这种方法了,搭建android环境就消耗了一天的时间,虽然可行,但是工程量巨大。 后来想到短信验证码应该会存储到redis缓存,那么用Python写函数直接从Redis里直接读取出来就可以。 import redis r=redis.Redis(

  • unity(登录注册用手机号短信验证)

    短信验证 1、短信验证我是通过mob的SMSSDK实现的(free) 官网下载:http://www.mob.com/wiki/detailed?wiki=SMSSDK_for_Unity3D&amp;id=23 2、在mob上注册一个账号,创建应用获得key和secret 替换案例中demo中的key和secret,即可 由于案例中的ui是在c#中搭建的,故若想自己搭建可视化ui可按照如下操...

Global site tag (gtag.js) - Google Analytics