JS作为一门如此灵活的语言,自然在编码时给我们带来了很多方便,但方便的同时,也衍生出了很多变态的语法,下面我们来梳理一些常见的变态语法,希望你下次在某位大牛的代码中看到这样的东西,不要惊掉下巴。

NO.1

Number.prototype.add = function(n){

return this+n;

}

2["add"](3)

最后一句话是什么玩意儿?好像没看懂呢? 我们来运行一下看看

我擦? 它居然执行了?结果是5,看上去似乎对2和3做了加法。

不是说变量名不能数字开头么?这是怎么回事?浏览器抽风了?

实际上js有很多不能说的秘密,其中一个就叫做自动装箱,这是引用java里的叫法。也就是说,当我们试图2[“add”]的时候,这个数字2已经不再是2了,它被自动转换成了Number对象,跟java中的包装类型是一个意思。

等价于这样写:

new Number(2)

而对象是可以通过[“prop"]这种形式来获取属性的,于是我们就不难推理了

2["add"] 相当于 new Number(2).add

最终变成

new Number(2).add(3);

结果是 5

NO.2

+function(){;}()

这又是个什么玩意儿?函数前面带个+号? 这难道是自动类型转换?等等,里面是个;号? 后面还有一对( )?

先不要着急惊讶,其实还有很多,例如:

-function(){;}()

!function(){;}()

~function(){;}()

void function(){;}()

new function(){;}()

delete function(){;}()

var i = function(){;}()

1 && function(){;}()

0 || function(){;}()

1 & function(){;}()

1 | function(){;}()

1 ^ function(){;}()

1, function(){;}()

我靠!这些丧尽天良的写法是谁发明的?!你给我站出来,我保证不打死你!

接下来说说它的原理吧

首先 ;号本身也是一条语句,相信大多数同学应该是知道的,就不多说了。其次,一个函数的自调用,如果写成这样:

错误的原因在于,函数声明和函数调用是不可以混在一起的,所以通常的写法是:

这并不是把函数当成了一个整体来运行,这里其实还有一个不能说的秘密

( )这个符号,在js里是运算符。(A)的结果是返回表达式A

所以它的出现,让这个匿名函数从声明变成了执行,也就是编译期间浏览器不会提前准备它,自然就没有语法错误。而5分钟前我们看到的那些丧心病狂的写法,其实原理都一样,通过运算符把声明变成执行。当然这些符号都不会影响函数的正常执行结果。

但是问题又来了,这种泯灭人性的写法,现在居然还挺常见的,例如:

没错,这就是著名的bootstrap的js源码,连它都是这么写的,莫非真有什么好处?

通过在网上查询大量的资料,我还真发现有人专门对此做了研究,将上面这些写法全部在各个浏览器中间做了压力测试,发现+function( ){;}( ) 执行速度最快,比(function( ){})( )要快出好几倍

而 new function( ){;}( ) 执行速度最慢。

不过为了追求效率而把代码写成这样到底值不值,那只能你自己去判断了。

NO.3

!!a

!!a 实际上等价于 a || false

由于js中所有的内容都是可以跟布尔类型互换的,这也是js特别让人费解的地方,比如

if(window.VBArray){…}

可以用来判断IE浏览器,因为对象存在时,等价于true,undefined等价于false,但是!很多时候我们判断一个属性是否存在,并不需要马上作出反应,而是将结果告知他人,比如说有个函数,test(hasSuperman),函数规定调用时需要传入一个布尔类型,告知它superman是否存在,你可能会这样写:

if(window.superman){

test(true);

} else {

test(false);

}

但你最好不要这么写:

test(window.superman);

因为你并不知道test函数内部发生了什么,所以很难预料会不会产生错误,因此最好的写法是这样:

test(!!window.superman);

通过两次取反,保证了值没有变化,但类型已经被转为了布尔类型。好吧,似乎这么写还有点道理。

NO.4 最短IE(6,7,8)判定

if(!-[1,]){

//判断IE6,7,8

}

它的原理实际上是利用了IE的bug。

当我们写下一个数组 [1,].length

在IE中 [1,].length -------> 2

在非IE中 [1,].length -------> 1

当我们试图打印[1,],相当于调用toString()方法

在IE中 [1,] -------> "1,"

在非IE中 [1,] -------> "1"

当我们给它加上负号-[1,]

在IE中 -[1,] -------> NaN

在非IE中 -[1,] -------> -1

当我们对它进行取反!-[1,]

在IE中 !-[1,] -------> true

在非IE中 !-[1,] -------> false

这样我们就可以判断是否为IE浏览器了,这个bug一直到IE9之后才消失的。

好了,这次的变态语法就先讲这么多,以后碰到更新鲜的再来给大家更新,拜拜。

在组织面向对象代码的时候我们通常使用的语法是 :

function Swiper(){

}

原型编程时我们往往会因为语言的无奈写成这样的 :

Swiper.prototype.init = function (){}

Swiper.prototype.render = function(){}

...

这样写丑陋且麻烦,那么如何让我们的代码变得更漂亮,更好用那?对于JS有一定了解的童鞋可能会这么写,兼容性良好且可以节省大量的代码。

Swiper.prototype = {

constructor : Swiper,

init : function(){

},

render:function(){

}

....

}

这样组织看起来工整一点但是还会存在不少莫名其妙的属性constructor是个啥,好像没啥用啊,那么如果我们在项目中加入了类似jQuery 这样的类库,我们的代码就可以变得更加简练,类似于这样

$.extend(Swiper.prototype,{

init : function(){

},

render:function(){

}

})

但是受限于语法,没法让方法看起来很很清爽,而且要引入一个庞大的类库,那么我们在项目构建时使用babel这样的编译工具,我们可以写成

Object.assign(Swiper.prototype,{

Init(){

},

render(){

}

})

现在你的代码可以无需任何类库,变得漂亮,优雅。甚至无需使用class关键字就可以让我们的代码变得清晰、耐看,有逼格。

说完了面向对象这个大事再跟大家普及两个极其方便的ES6新特性。

一行式数组去重:

var arr = [1,1,2,3,2,3,4,5,6,7]

arr = Array.from(new Set(arr));

ok数组去重完毕,不再用一大堆逻辑代码处理数组中的重复,不可谓不”变态”

让我们的HTMLCollection 可以使用forEach , map ,filer... 等遍历属性 :

当我们选择一组元素想要遍历的时候我们在es5中往往需要非常恶心的for循环语法:

例如 :

var domlist = document.querySelector(“.list”);

我们需要使用非常恶心的for 循环

for( var i = 0 ; i < domlist.lenght ; i++){

domlist[i].....

}

恶心的让人欲仙欲死,那么如何让这段代码变得优雅那 ?

domlist = Array.from(domlist)

domlist.forEach( dom =>{

dom....

})

怎么样,是不是代码上了一个台阶的赶脚。

JS有哪些变态语法,你知道吗?的更多相关文章

  1. js有哪些变态的语法?

    JS这个语言好是好,但是很多时候写起来太丑了,每次看大牛的代码的时候,妈妈都问我为什么跪着读代码,随着 ES 2015的普及我们可以写出很多可读性强且漂亮的代码,那么接下来就带着大家一块学习一下可以把 ...

  2. node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法

    1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...

  3. js 正则练习之语法高亮

    原文:js 正则练习之语法高亮 学了几天正则,差不多该总结整理写成果了,之前就想写语法高亮匹配来着,不过水平不够,看着例子都不理解.今天就分析下 次碳酸钴 和 Barret Lee 语法高亮实现. 先 ...

  4. 针对单个 js 文件禁用 ESLint 语法校验

    问题描述: 在 Vue-cli 创建的项目中,使用了 ESLint 规范代码的项目中 如何针对单个 js 文件禁用 ESLint 语法校验,但整个项目依然保留 ESLint 的校验规则? 解决方案: ...

  5. 让 Node.js 支持 ES6 的语法

    为了让 Node.js 支持 ES6 的语法, 需要使用 Babel. 安装 es-checker 在使用 Babel 之前 , 我们先检测一下当前 node 对 es6 的支持情况. 在命令行下执行 ...

  6. JS的DOM操作语法

    整理了一下JS的DOM操作语法,这里做下记录. <!DOCTYPE html> <html> <head> <meta charset="utf-8 ...

  7. JS的BOM操作语法

    整理了一下JS的BOM操作语法,这里记录一下. <!DOCTYPE html> <html> <head> <meta charset="utf-8 ...

  8. JS程序的基本语法

    JS程序的基本语法 JS是区分大小写的.如:Name和name是两个变量 JS中每一条语句,一般以英文下的分号(;)结束.这个分号不是必须的.为了向PHP兼容,最好加上分号. 运算符和变量,以及操作之 ...

  9. 让Node.js支持ES6的语法

    使用命令,全局安装es-checker: cnpm install -g es-checker 安装好之后,执行以下命令来查看Node.js对ES6的支持情况. es-checker 可以从输出中查看 ...

  10. JS函数 -- 功能,语法,返回值,匿名函数,自调用匿名函数,全局变量与局部变量,arguments的使用

    “JavaScript设计得最出色的就是它的函数的实现.” -- <JavaScript语言精粹> 函数包含一组语句,它们是JS的基础模块单元,用于指定对象的行为.一般来说,所谓编程,就是 ...

随机推荐

  1. CF1561D Up the Strip

    Up the Strip 题意 你现在在 \(n\) 号格子,你需要跳到 \(1\) 号格子,你可以有两种跳法: 你可以做减法,即选择一个数 \(k\in [1,n)\) ,从 \(n\) 跳到 \( ...

  2. Mysql--查询"01"课程比"02"课程成绩高的学生的信息及课程分数

    今天在写Mysql代码作业时,写到这个题,感觉值得分享!!!!!!! 查询"01"课程比"02"课程成绩高的学生的信息及课程分数 分析如下: 首先先查询&quo ...

  3. dedecms安装使用

    1.运行 http://域名/install/index.php(比如你的域名是:http://www.dede58.com/,就输入http://www.dede58.com/install/ind ...

  4. rabbitMq安装 - docker

    安装rabbitmq 参考网站:https://www.rabbitmq.com/download.html 方式一: 获取rabbit镜像: docker pull rabbitmq:managem ...

  5. python机器学习——kmeans聚类算法

    背景与原理: 聚类问题与分类问题有一定的区别,分类问题是对每个训练数据,我给定了类别的标签,现在想要训练一个模型使得对于测试数据能输出正确的类别标签,更多见于监督学习:而聚类问题则是我们给出了一组数据 ...

  6. react+antd pro实现【列表可实时行内编辑】的弹窗表单组件

    纯列表版效果展示: ① 初始无值,展示为唤醒按钮+文案外链 ②点击按钮唤醒弹窗(简易版示意图) ③配置后 可编辑表格组件文档: https://procomponents.ant.design/com ...

  7. sql server 01

    1. 数据库管理系统(DateBase Management System )DBMS 是专门为管理数据库而设计的一个电脑软件系统 分为两种: (1)关系数据库:建立在关系模型基础上的数据库,比如 S ...

  8. Winform多线程访问UI控件问题

    Winform多线程无法访问UI控件,考虑使用委托方法解决.

  9. doy 20 系统优化

    系统优化 1.yum源的优化 CentOS   base   epel ​自建yum仓库​使用一个较为稳定的仓库​wget -O /etc/yum.repos.d/CentOS-Base.repo h ...

  10. CF1272 B DIV3 ---代码对比

    这次DIV3有点可惜啊,题解是我的与学长的代码对比 学长的原博客https://www.cnblogs.com/xyq0220/p/12036109.html B.Snow Walking Robot ...