不一样的JavaScript

栏目: JavaScript · 发布时间: 6年前

内容简介:js语法看起来是类c的,如果有c语言基础,可以看懂一些js代码,尤其是类似这样的代码:只看这段代码,跟c的写法甚至完全一样。很容易让你有种错觉,简单看下js语法,就能写出优秀的js代码。但是,不要被骗了,当你看到后面的代码时,就不会再这样想了。下面就列举一些js语法上感觉有趣或比较特别的例子

js语法看起来是类c的,如果有 c语言 基础,可以看懂一些js代码,尤其是类似这样的代码:

for (i = 0; i < 10; i++) {
    // code
}

只看这段代码,跟c的写法甚至完全一样。很容易让你有种错觉,简单看下js语法,就能写出优秀的js代码。

但是,不要被骗了,当你看到后面的代码时,就不会再这样想了。下面就列举一些js语法上感觉有趣或比较特别的例子

变量声明可以放在使用之后

function foo() {
    a = 3;			// 此处使用
    console.log(a);
    var a;			// 此处声明
}

对象可以动态的增加属性,不需要提前声明

var o = {};
o.p1 = "good";
o.p2 = 35;
console.log(o);	// Object {p1: "good", p2: 35}

对象的属性也可地动态的删除

var o = {p1: "good", p2: 35};
delete o.p1;
console.log(o);	// Object {p2: 35}

函数也是对象,也有方法。如可以调用length,获取参数个数

function myAdd(a, b) {
    return a + b;
}
console.log(myAdd.length);	// 输出2

也是支持自定义的方法添加的

函数定义时,可以不指定参数,但在使用时可以传任意参数

function noParamFunc() {
    console.log(arguments)
}
noParamFunc(1, 2)	// 输出1, 2

可以动态决定函数的定义

if (condition) {
    function sayHi() {
        console.log("Hi");
    }
} else {
    function sayHi() {
        console.log("Hey");
    }
}
sayHi();		// 根据condition的值输出Hi或Hey

函数可以这样定义

var myAdd2 = x => x + 2;
myAdd2(5);

这种写法在定义简短的函数以及闭包时会非常简洁

如写出如下简洁实用的函数:

const longestConsec = (a, k) => (k < 1 || a.length < 1 || k > a.length)
? ''
: a.map((_, i, a) => a.slice(i, i + k).join(''))
.reduce((a, b) => a.length >= b.length ? a : b)

函数定义时将其赋值给其它变量,则函数名在外部不再可用

var foo = function bar() {
    console.log('good');
}
bar();  // 出错,这儿只能通过foo()来调用
foo();  // ok

但是,如下的写法又是正确的:

function bar() {
    console.log('good');
}
var foo = bar;
bar();  // ok
foo();  // ok

在for循环里定义的变量,作用域是超出for的

for (var i = 0; i < 10; i++) {
    console.log(i);
}
console.log(i); // 仍然可以访问,且是访问的上面的这个i

一元加号,可以将字符串转为数字

+"10"		// 就是数值10

数组创建的歧义

// 看起来相同的写法,但行为预期却不一样
var a1 = new Array(3, 4, 5);
var a2 = new Array(3);
console.log(a1);     // [3, 4, 5]
console.log(a2);     // [] 长度为3的空数组

作用域不注意,可能行为也是不可预期

// 全局作用域
for(var i = 0; i < 10; i++) {
    subLoop();
}

function subLoop() {
    for(i = 0; i < 10; i++) {
        console.log(i);
    }
}

这段代码本来是想执行100次的循环,但实际只会执行10次

奇怪的相等判断

0 	==	""            // true
0	==	"0"           // true
"" 	== 	"0"           // false

奇怪但有效的表达式

[1,2,3][1,2];	// 输出3
++[[]][+[]]+[+[]];

这个也是有效的表达式,表达式的值是10。 具体原因可以参考 这篇文章

JS语法本身是需要分号的

var a = 5
var b = 6
// code

虽然写的代码可以不加分号,在解释执行时,解释器会帮我们补上分号:

var a = 5;
var b = 6;
// code

但有时候依赖于解释器加分号的话,行为可能不是预期的

参考资料

JavaScript秘密花园

JavaScript之Function函数深入总结


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

设计模式解析

设计模式解析

Alan Shalloway、James R.Trott / 徐言声 / 人民邮电出版社 / 2013-1 / 55.00元

《设计模式解析(第2版·修订版)》,本书首先概述了模式的基础知识,以及面向对象分析和设计在当代软件开发中的重要性,随后使用易懂的示例代码阐明了12个最常用的模式,使读者能够理解模式背后的基本原则和动机,理解为什么它们会这样运作。一起来看看 《设计模式解析》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试