调皮的Javascript

最近开始接触前端的东西。不可或缺的是Javascript这门语言。今天遇到了一些比较神奇的事情。表明这门语言要用好并不是那么的容易。

1. 自动添加分号

javascript 的分号并不是必须的,不过忽略的话会发生一些比较有趣的事情。
我在火狐的Firebug里面编写下列代码:

var x = 3;
var y = 4;
x
++
y
console.log(x);
console.log(y);

上面代码会被解析成** x; ++y;** 最后打印结果为 3, 5。javascript的解析器貌似会比较人性化地判断哪些地方需要断句才能够让例子跑起来。(注意是跑起来,不一定是正确地跑起来), 再看下面这个例子:

function pulsOne(x) {
    return x + 1;
}
y = plusOne
(12+22) + 100.toString()

最后结果很奇怪的,代码会被解析成 y = plusOne(12 + 22) + 100.toString(),结果为35100。但是并不是所有的东西都会跟下一行拼接,比如有些关键字:

function f(x) {
    return
    x
}

a = f(33)

这个时候我们都期望是33但是结果却是 undefined。表明它遇到意外了。遇到return之后就自动断句了。同类的会自动断句的还有continue, break

所以我觉得没什么事还是老老实实得加上分号吧,对于代码可读性十分重要。

2. 小心黑魔法

我们写代码总是不可避免的需要去排序。我在node交互环境下对数组[1,12,23,4,5]进行排序

 > [1,12,23,4,5].sort()
 [ 1, 12, 23, 4, 5 ]

上面得出的结果很明显不是我们想要的。它这里进行了类型转换。都把我们需要比较的值转换成对应的字符串初始值(toString()处理)然后再进行比较了,所以有了这个坑爹的结果。要解决这个问题。我们需要传入比较函数。

> [1,12,23,4,5].sort(function(a, b) {return a > b})
[ 1, 4, 5, 12, 23 ]

这个就是我们想要的结果了。如果我们设定比较函数的话,通过里面的小于号,会对我们需要比较的对象做valueOf()的初始值的转换。就能得到我们想要的结果了。

3. 隐藏的对象包装

var s = "test";
s.len = 4;
var t = s.len;

由上面等式得出的t的结果是undefined,这很让人费解。这里有个javascript的特性叫做包装对象。当字符串s被赋值后进行了s.len = 4的操作。这个时候会将字符串值调用new String(s)来创建一个临时的字符串对象,赋值成功后就会将其销毁。这叫做包装对象。。。。。所以当我们给t赋值的时候对象已经被销毁了。换句话说s.len已经不存在了。所以t的值是undefined

那我们现在来做一个实验。包装过的字符串跟没有包装过的字符串是否相同?

> s2 = new String("I Love Ruby")
[String: 'I Love Ruby']
> s1 = "I Love Ruby"
'I Love Ruby'
> s1 == s2
true
> s1 === s2
false

很明显,他们的原始值(通过toString或者valueOf处理),然而他们本质上(通过===可以对他们的类型加以判断)是不同的。

4. 函数作用域

函数作用域问题一直是比较头疼的事情。举一个权威指南里面一个比较经典的例子。它表明javascript的局部变量作用域是函数级别的。并且会有一种看起来声明提前的现象。

var scope = "global"
function f() {
    console.log(scope);
    var scope = "local";
    console.log(scope);
}

我在node里面运行函数f得到的结果是

> f()
undefined
local

神奇吧,首先打印的scope并不是我们期望的global,因为在函数f的作用域里面全局变量被函数内部变量覆盖了。先会引用局部定义的同名变量。所以上面的例子的表现就是如下面这堆代码:

var scope = "global"
function f() {
    var scope;
    console.log(scope);
    scope = "local";
    console.log(scope);
}

相当与我们把声明提前了。然后在后面再对声明的变量进行赋值。这也是Javascript里面比较特殊的地方吧。

以上都是我今天接触Javascript后发现的一些比较奇怪的事情。《Javascript权威指南》这本书有比较详细的说明,我只是抽取一些我觉得比较特殊的东西来总结一下。希望于我于大家来说都有好处吧。后期会继续跟进相关的话题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,204评论 0 4
  • FreeCodeCamp - Basic JavaScript 写在前面: 我曾经在进谷前刷过这一套题,不过当时只...
    付林恒阅读 16,424评论 5 28
  • 第三章 影像店的男人 “喂,有人在吗?”有人问着,李木子正垫着脚尖翻看着书架的书,她扭头看过去,一个棕色微卷头发,...
    云朵默阅读 230评论 0 0
  • SDK管理利器——sdkman 项目使用java的开发者一定会为新配环境变量而头大,sdkman很好的解决了系统s...
    帷幄庸者阅读 3,915评论 0 6
  • 荒草满地的繁华, 像那西边升起的艳阳 草木丛生的凄凉, 是泡在不羁中的你。 要把荒草点着, 戏耍艳阳在烽火中 要丟...
    我和我的故事阅读 177评论 0 0