前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >js的坑,你遇到过几个

js的坑,你遇到过几个

作者头像
IT架构圈
发布2018-05-31 15:38:40
1.1K0
发布2018-05-31 15:38:40
举报
文章被收录于专栏:IT架构圈IT架构圈

1.变量类型模糊,容易出现问题;

代码语言:javascript
复制
    var a='1',b=1;
    a==b; //true
    a===b; //false

2.全局变量与函数内部变量同名时,在函数内部声明变量,声明位置虽然在后,但在这之前,此名变量已为‘undefined’;

其实这个的准确说法应该叫法,作用域声明提前,也就是说在作用域内所有的声明都会在编译前放到作用域的最前面,赋值位置不变。

代码语言:javascript
复制
    var a = 'aaa';
    function b() {
        console.log(a);
        var a = 'bbb';
        console.log(a);
    }
    b();
    console.log(a);
    输出:
    undefined
    bbb
    aaa

3.浮点数运算BUG,例如7*0.8=5.6000000000000005;

4.变量传递,对象为引用传递,数字和字符串是值传递;即函数内不能改变变量地址

代码语言:javascript
复制
    var a = {};
    var b = '我是b1';
    a.name = 'aaaa';
    (function(a,b) {
        console.log(a.name);//aaaa
        a.name = 'bbbb';
       b='我是b2';
        console.log(a.name);//bbbb
        a = {};
        a.name = 'cccc';
        console.log(a.name);//cccc
       console.log(b);//我是b2
    })(a,b);
    console.log(a.name);//bbbb,a传入函数内为引用传递,可以改变a内的属性,但a={}时,函数内的a被重新定义了不再指向函数外的a,所以不能是cccc。
    console.log(b);//我是b1,值传递,函数内改变不会影响外面。

5.对象赋值是引用复制。其实和上面的意思差不多。

代码语言:javascript
复制
    var a=[];
    var b=a;
    b[0]=1
    a[0]         //结果也为1
    a===b    //true

6.不要把原始类型当作对象,虽然它很像

代码语言:javascript
复制
var s='dddd';
s.length   //4,很像对象吧,还有方法。其实这里面有隐式的new String(s)
s.len=5;
s.len //undefined,这是因为,s真的不是一个对象,它是原始类型是不能改变的

7.不用声明就可以变量赋值,一不注意就生成一个全局变量

代码语言:javascript
复制
var abc=3;
+function(){
      ab=5;  //这时本意是使abc=5,但因为少打一个c,创建了一个全局变量ab,程序还不会报错。
         }()

8.||和&&的优先级,&&比||优先,都比’=‘优先,不要以为顺序执行a=4,其实这个不是js的坑,大部分语言都这样

代码语言:javascript
复制
var a=1;
(a=2)||(a=3)&&(a=4);//结果a=2
(a=5)&&(a=6)||(a=7);//结果a=6//因当||左值为真时,右表达式不再运算
(function(){a=5})()&&(function(){a=6})()||(function(){a=7})();//a=7,因为函数要先运算完再计算&&||
var A=[10,20,30,40,50],i=2;
A[++i]=A[++i]=++i;
console.log(A);
[10, 20, 30, 5, 5]//这个结果想到了吗?++先进行运算从左右至右运算,A[3]=A[4]=5,=为先右运算,A[4]=5;A[3]=A[4];因=最后执行,当||左值为真时,右表达式不再运算,当&&左值为假时右表达式不再运算

一定要记住增值=表达式,优先级在最后。还有个更后的是逗号表达式。

运算符

描述

. [] ()

字段访问、数组下标、函数调用以及表达式分组

++ -- - ~ ! delete new typeof void

一元运算符、返回数据类型、对象创建、未定义值

* / %

乘法、除法、取模

+ - +

加法、减法、字符串连接

<< >> >>>

移位

< <= > >= instanceof

小于、小于等于、大于、大于等于、instanceof

== != === !==

等于、不等于、严格相等、非严格相等

&

按位与

^

按位异或

|

按位或

&&

逻辑与

||

逻辑或

?:

条件

= oP=

赋值、运算赋值

,

多重求值

9.日期类型在转换时优先转换为字符串型。

代码语言:javascript
复制
    var k=new Date();//Date {Wed Oct 19 2016 10:47:39 GMT+0800}
    k+1;//"Wed Oct 19 2016 10:47:39 GMT+08001",k转换成字符串,再加上1,1也被转换为字符串了。
    k-1;//1476845259584,这时k转换为字符串,表达式无法计算,所以转换为数字时间戳。

10.变量类型的隐式转换,js期望表达式为字符串或数字会进行隐式转换,转换方法如下表,摘自js权威指南第6版一定要注意!"0"是false,!0是true

11.全局var和function的属性不能被delete;delete是用来删除对象属性的,但只是断开属性与对象之间的联系,并不会更改属性中的属性

代码语言:javascript
复制
    var x=1;//声明一个全局变量
    delete this.x;//返回false,失败,function声明的也一样
    this.y=1;//创建一个全局y
    delete this.y;//返回true成功

12.注意in和hasOwnProperty()的区别

代码语言:javascript
复制
    var o={x:1};
    'x' in o;//true
    'toString' in o;//true
    o.hasOwnProperty('x');//true
    o.hasOwnProperty('toString');//false

13.function函数定义

代码语言:javascript
复制
    function a(){
      console.log(1);      
    }
    if(!a){
        function a(){
            console.log(2);
        }  
    }
    如上写法safari中a()输出2,chrome中输出1
    正确写法
    function a(){
      console.log(1);      
    }
    if(!a){
        a=function(){
            console.log(2);
        }  
    }

这样就都输出1了

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程坑太多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档