zoukankan      html  css  js  c++  java
  • 《JavaScript启示录》摘抄

    1、JavaScript预包装的9个原生的对象构造函数:

    Number(),String(),Boolean(),Object(),Array(),Function(),Data(),RegExp(),Error()

    2、以上对象返回的类型除了Function返回function外,其他的都返回object。

    var myString=new String('foo');
                console.log(typeof myString);
                var myRegExp=new RegExp('\bt[a-z]+\b');
                console.log(typeof myRegExp);
                var myFunction=new Function("x","y","return x+y");
                console.log(typeof myFunction);
                var myNumber=new Number(23);
                console.log(typeof myNumber);
                var myObject=new Object();
                console.log(typeof myObject);
                var myArray=new Array('foo','bar');
                console.log(typeof myArray);
                var myData=new Date();
                console.log(typeof myData);
                var myError=new Error('Crap!');
                console.log(typeof myError);
                var myBoolean=new Boolean(false);
                console.log(typeof myBoolean);

    image

    3、原生对象、自定义对象构造函数  代码对比

    var Person=funtion(living,age,gender)
                {
                    this.living=living;
                    this.age=age;
                    this.gender=gender;
                    this.getGender(){return this.gender;}
                }
                var codyA=new Person(true,33,'male');//自定义构造函数
                var codyB=new Object;
                codyB.living=true;    //原生对象

    4、复杂值:原生对象构造函数Object(),Array(),Function(),Data(),RegExp(),Error()是复杂类型,因为他们包含一个或多个原始值或复杂值。      P18

    5、原始值(简单值)复制的时候复制的是值,复杂值复制的时候是复制的地址,即按照引用的方式复制。

    6、使用new关键字创建String(),Number(),Boolean()值时,或者这些值在后台被转换成复杂对象时,即使原始值可以被看做是复杂值,他们也不具备通过引用进行复杂计算的特性。区别于第五点。     P20

    7、复杂对象比较是按照地址比较的,即如果两个比较的对象指向同一地址,那么输出true,否则输出false,这与简单值的比较按照值比较不同。还需要注意的是,复杂对象的比较符号是===,注意是三个=。

    8、delete是删除对象属性的唯一方法,因为将对象的属性设置为undefined或者null时只能改变属性的值,而不会将该属性从对象中删除。注意,delete不会删除原型链上找到的属性。

    var foo={bar:'shabi'};
                delete foo.bar;
                console.log('bar' in foo);

    结果会输出false,因为foo对象的bar属性已经被删除了。

    image

    9、hasOwnProperty函数可以检测一个属性是否来自原型链,当来自对象本身时,返回true,当来自原型链时返回false。

    var myTest={foo:'value'};
                console.log(myTest.hasOwnProperty('foo'));    //返回true
                console.log(myTest.hasOwnProperty('toString'));    //返回false

    10、区别于第9点,当我们使用   in  操作符查找某个属性的时候,他不光会查找自己本身的属性列表,还会通过原型链查找,而一旦找到了这个属性,都会返回true。     P37

    var myTest={foo:'value'};
                console.log(myTest.hasOwnProperty('foo'));    //返回true
                console.log(myTest.hasOwnProperty('toString'));    //返回false
                console.log('toString' in myTest);            //返回true

    11、for in循环不仅会遍历特定对象的本地属性,还会遍历所继承(通过原型链)的对象上的属性,因此,我们需要在循环内加入hasOwnProperty()函数过滤掉哪些通过原型链查找到的属性。

    var cody={age:23,gender:'male'};
                for(var key in cody)
                {
                    if(cody.hasOwnProperty(key))
                    {console.log(key);}        //输出age和gender
                }

    12、JavaScript和c++的变量都是以字母、下划线开头的,以字母、数字、下划线组成的字符串来命名变量。

    13、函数都会返回值,当我们没有显式设置返回值的时候,函数会返回undefined。     P52

    14、自调用函数:在定义函数表达式后立即调用该函数表达式。       P59

    var sayWord=function(){console.log('大帅B')}();

    15、在JavaScript中,只有全局作用域、局部作用域(函数作用域)、evel作用域。它不同于c++,它不存在块作用域,即在if、for语句块内无法创建作用域,变量可以相互覆盖。  P78

    var temp=10;            //temp在任何地方都有效  包括test函数和eval语句
                var test=function()
                {    console.log(temp);
                    var temp1=100;        //temp1只在test函数作用域内有效
                }();
                eval('var temp2=1000;console.log(temp);'); //temp2只在eval语句中有效
                console.log(temp);
                console.log(temp1);    //输出undefined
                console.log(temp2); //输出undefined

    16、JavaScript会将缺少var的变量声明为全局变量,即便这个变量在函数体中。    P78

    var temp=10;            //temp在任何地方都有效  包括test函数和eval语句
                var test=function()
                {    console.log(temp);
                    temp1=100;        //temp1前面没有var  此时他是全局作用域的
                }();
                eval('temp2=1000;console.log(temp);'); //temp2前面没有var  此时他是全局作用域的
                console.log(temp);
                console.log(temp1);    //输出100
                console.log(temp2); //输出1000

    17、闭包:

    var count=function()
                {
                    var i=0;
                    return function()
                    {
                        return i++;
                    }
                }()        //这里的()不要忘记 起到count函数立即调用自己的作用
                console.log(count());    //输出0
                console.log(count());    //输出1
                console.log(count());    //输出2

    18、有没有new关键字很重要:

    var myBoolean=Boolean(0);    //这里没有使用new关键字  当做原始值处理
                if(myBoolean)
                    console.log('myBoolean is true');
                else
                    console.log('myBoolean is false');
                    
                var myBoolean1=new Boolean(0);    //使用new关键字  false布尔对象 实际上是true对象
                if(myBoolean1)
                    console.log('myBoolean1 is true');
                else
                    console.log('myBoolean1 is false');

    输出结果:image

    可以看到没有使用new关键字时,输出false;

    使用了new关键字时,输出true。(非原始false布尔对象转换为true)       P111

    19、对于拥有null值的变量,typeof操作符会返回object。    P117

    var myObject=null;
                console.log(typeof myObject);
                console.log(myObject===null);

    输出为:

    image

  • 相关阅读:
    bootstrap基本用法
    Maven学习笔记(一)
    Tomcat的安装以及基本配置
    jQuery实现用户头像裁剪插件cropbox.js
    position的用法与心得
    ES6新特性学习(一)
    jQuery mobile 滑动打开面板
    vue-day05----自定义指令(directive)、render和template的区别、mixin混入、Vue.use()、Vue.extend()、Vue.filter()、vue中的数据流向
    我的一个React路由嵌套(多级路由),路由传参之旅
    vue04----watch、slot、响应式原理、set、vue脚手架(vue-cli)、单页面应用和多页面应用、单页面开发首屏加载过慢,白屏如何缓解
  • 原文地址:https://www.cnblogs.com/audi-car/p/4760389.html
Copyright © 2011-2022 走看看