js糟粕
正在看《javascript语言精粹》,遇到明显的特点就记录下来,以防看了白看(噗噗~)
为了不误导,形成错误印象,文中 ‘错误设计‘ 写成 ‘现有设计’,’正确设计‘ 写成 ’期待设计‘。然而期待只能是期待,因为他已经被使用的太广泛了。。。不能说改就改了
1.js中this指向:
函数调用有四种模式,方法调用、函数调用、构造器调用和apply调用模式。
现有设计:其中函数调用模式与其他不同,this被绑定到全局对象。
期待设计:绑到外部函数的this。
2.参数arguments并不是一个真正的数组
(ps:就像一个男人被阉割了一样---有心无力---有心无力,它只是一个拥有length属性的array-like对象,并没有数组方法)
3.作用域
js木有块级作用域,,,所以最好在函数开头部分声明所有用到的变量。
4.全局变量
糟糕之中的战斗鸡!如果全局变量名称碰巧和子程序中的变量名相同,那他们将会相互冲突导致程序无法运行,通常还难以调试。
全局变量声明有三种方式:①不在任何函数内 var foo = value;②全局对象window下 window.foo = value;③直接使用未声明变量 foo = value;
5.自动插入分号
哎,,,本来一片好心却变成画蛇添足了。。。你如果这样写代码:
return
{
status: true //会在行末加一个分号;
}
注意啊,为了避免,只能这样写了:囧~
return {
status: true
}
6.保留字
占着茅坑不拉屎,搞了那么多保留字但大多数并没有在语言中使用,保留字不能命名变量、参数。当其被用作对象的键值时,他们必须被括号引起来,所以只能用[]表示法。
var class; //非法
object = {case: value}; //非法
object['case'] = value; //ok
object.case = value; //非法
7.Unicode
设计javascript的时候,作者预计 Unicode 最多只会有 65536 个字符,他没想到人们这么有情趣,从那以后它的容量慢慢增长到了1百万个字符~
8.typeof(识别运算数类型,返回类型字符串)
typeof null //返回 'object' 而不是 'null'
value === null //检测null的好方法
另外检测对象的值时,null可能混淆,typeof不能分辨,所以利用null为假,对象为真来实现:
if (value && typeof value === 'object') {
//value 值为对象或者数组。
}
typeof /a/ //正则在最新浏览器下返回 'object' ,旧版可能返回'function'
9.parseInt 将字符转为整数。
parseInt('16');
> 16
parseInt('16df');
> 16
parseInt('011'); //0开头的字符串按,十进制
> 11
parseInt(011); //0开头的数字按,八进制了
> 9
parseInt('0x11'); //0x开头的字符串和数字都按16进制
> 17
parseInt(0x11);
> 17
//有木有乱了啊,,,所以第一个带上引号,再带上基数参数就不用怕了,默认为10进制
parseInt('011', 8);
> 9
parseInt('0x11', 16);
> 17
10. +
书中说‘+’ 号也是糟粕,原因如下
1 + 2 + ''
"3"
1 + '' + 2 + 4 + ''
"124"
11. 浮点数
这是遵循浮点数算数标准(IEEE 754)而有意导致的结果,浮点数中整数运算是正确的,所以小数表现出来的错误可以通过指定精度来避免。我只知道有个toFixed()函数。你还可以乘以100,运算完毕再降结果除以100,就相当于精确到了两位。。。同理
0.1 + 0.2 !== 0.3
0.1 + 0.2
0.30000000000000004 .1 + .2
0.30000000000000004
12. NaN 一个特殊的数量值,并不是一个数字。
typeof NaN
> "number" //即使返回 'number' ,它也不是个数字 + '1'
> 1 //即使试图把非数字转为数字,它还不是个数字 + 'oops'
> NaN //即使。。。它不是数字
这样一来也就有个定理:如果产生了NaN的结果,你至少有一个输入项为NaN或者某个地方产生了NaN
NaN === NaN
false NaN !== NaN
true //只分辨数字和NaN
isNaN(NaN)
> true
isNaN('a')
> true
isNaN(1)
> false
但是当你希望判断一个值是否为数字时,怎么能让NaN不混淆你呢?
//完美了。
function isNumber(val) {
return typeof val === 'number' && isFinite(val);
} //世界上最短的。。刚看到一篇博客来补充下
function isNumber(val) {
return val === +val; //不能被转为数字的val为false,其余为数字。。。
} isNumber(1)
> true isNumber(NaN)
> false isNumber('1')
> false
13.伪数组
js糟粕的更多相关文章
- 深入js隐式类型转换
前言 相信刚开始了解js的时候,都会遇到 2 =='2',但是 1+'2' == '1'+'2'为false的情况,这时候应该会是一脸懵逼的状态,不得不感慨js弱类型的灵活让人发指,隐式类型转换就是这 ...
- 你可能忽略的js类型转换
前言 相信刚开始了解js的时候,都会遇到 2 == '2',但 1+2 == 1+'2'为false的情况.这时候应该会是一脸懵逼的状态,不得不感慨js弱类型的灵活让人发指,隐式类型转换就是这么猝不及 ...
- Front End Books
Front End Books 记录和推荐一些认为还不错的前端方面的书籍.列入标准: 看过,并觉得值得推荐给大家的. 正在看的,已经觉得不错的,或者听闻别人说不错的. 打算看的,经多人推荐,一致认为必 ...
- MVVM大比拼之avalon.js源码精析
简介 avalon是国内 司徒正美 写的MVVM框架,相比同类框架它的特点是: 使用 observe 模式,性能高. 将原始对象用object.defineProperty重写,不需要用户像用knoc ...
- 初探JavaScript(三)——JS带我"碰壁"带我飞
已经写了两篇关于小白的JavaScript之行,不可否认,每一种语言都有其精华与糟粕之处,来不及细细体味其精华奥妙,也没法对其评头论足,只能先了解,后深入.到目前为止已经看完<JavaScrip ...
- 我所了解的JavaScript糟粕和鸡肋
糟粕 全局变量 众所周知,全局变量在很小的程序中可能会带来方便,但随着程序变得越来大,全局变量将难以处理,全局变量将降低程序的可靠性. 在js中有3种方式定义全局变量 脱离任何函数安排一个var语句 ...
- 【JS复习笔记】07 复习感想
好吧,其实<JavaScript语言精粹>后面还简单介绍了代码风格,优美特性,以及包含的毒瘤.糟粕. 但我很快就看完了,发现其实都在前面讲过了,所以就不写了. 至今为止已经算是把JavaS ...
- JS精粹:下半部分
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JS上了贼船
本文纯属个人观点,没有引经据典,没有小心求证,just吐槽. 互联网的火热.移动web,带动了前端的飞速发展,js好像搭上了顺风车,身价水涨船高,如日中天. web前端是啥?html + css + ...
随机推荐
- MySQL5.6 windows7下安装及基本操作
图形界面安装MySQL5.6关于图形界面的安装,网上相关相关资料比较多,此处省略安装过程.安装过程中选择安装路径.所需组件及root账号密码.1.目前针对不同用户,MySQL提供了2个不同的版本:My ...
- 【小知识+小细节】不断更新ing...
1.printf printf("%.0lf",k) 输出的不是floor(k) 而是k四舍五入 ..才发现.xlf 都是四舍五入取x位 2.cin char buff[300] ...
- NET基础课--WinForm开发推荐3
用户体验 较长时间的运算:使用进度条(progress bar) 不要阻塞界面(UI)线程:使用多线程进行长时间的运算 状态栏(status bar)提示应用程序的状态 操作开始之后,用户应当能够通过 ...
- Sublime+Emmet
Sublime使用Package Control安装Emmet插件: 按Ctrl+Shift+P命令板 输入install然后选择install Package,然后输入emmet找到 Emmet C ...
- delete、update忘加where条件误操作恢复过程演示
update.delete没有带where条件,误操作,如何恢复呢? 我现在有一张学生表,我要把小于60更新成不及格. mysql> select * from student; +----+- ...
- 给WebApp加一个“壳”,实现Andriod系统添加到桌面
IOS系统的Safari浏览器有一个“添加到桌面”的功能,能在手机桌面上为你的Webapp添加一个快捷方式,其外观和Native App看起来一样. 这个功能对Webapp来说太有用了,它能让用户像“ ...
- svg 文字
<text>标签 在svg中用使用<text>标签去定义一段文字.如 Example 1 在svg中写下 在平坦的路上曲折前行 Example 1 Dome <svg h ...
- 构建混合云:配置Azure site to site VPN连接(2)
那么接下来的部分,我们开始正式配置S2S VPN: 首先配置本地网络,什么是本地网络呢?如果你在Azure上配置,本地网络意思是你自己的数据中心需要和Azure进行连接的网络段,而不是Azure上的网 ...
- Oracle EBS-SQL (PO-18):检查工作台下达的PR在系统找不到.sql
select * From apps.po_requisitions_interface_all---------------------------------------------------- ...
- javascript中的动画的实现以及运动框架的编写(1)
大家知道js可以做出好多很漂亮的动画,看上去很神奇,其实原理很简单,今天就讨论一下js动画的实现以及如何编写可以反复重用的运动框架. 首先做一个简单的例子,我这里有一个长50px 宽20px的长条形d ...