zoukankan      html  css  js  c++  java
  • 私人定制javascript中对象小知识点(Only For Me)

    废话不多讲,先上笑话,然后再,。看懂这个的说明你的节操已经不再了。

    晚饭后去理发店理发。。。割了吧。。。老板问我怎么剪,我悠悠的来一句往帅了剪。。。高潮往往令人想不到。。。。旁边一在焗油烫头发的大妈说到 别这样为难老板,人家赚点钱不容易。。。
    首先如果你是高手那么请出门右转,如果你是菜鸟那么恭喜你,go on吧

    全局对象
    在javascript程序中任何位置,都可以拈来就用的这种东西,是全局对象的属性.那么属性所在的对象也就是全局对象了。
    当javascript解释器启动时(或者任何Web浏览器加载新页面的时候),它将创建一个新的全局
    对象,并给它一组定义的初始属性:
    1.全局属性,比如undefined,Nan
    2.全局函数,例如isNaN(),parseInt()
    3.构造函数,比如Date(),String()
    4.全局对象,比如Math和JSON()
    代码中声明了一个全局变量,这个全局变量就是全局对象的一个属性
    以上代码纯属占篇幅,上代码

    var s="hello world!"; 
    var tempstr=s.substring(s.indexof(" ")+1);

    有没有有想过为什么s会调用substring()方法呢?

    答案是只要引用了字符串s的属性,javascript就会将字符串值通过new String(s)的方式转换成对象,
    这个对象继承了字符串的方法,并被用来处理属性的引用。一旦属性引用结束,这个新创建的对象就会销毁。
    举例为证:

    var s="test"; 
    s.len=4; //给它设置一个属性 
    var temp=s.len;
    console.log(temp) //undefined

    解释:第二行代码创建一个临时字符串对象,并给其len属性赋值为4,但是马上就销毁这个对象。第三行试图访问临时属性,

    修改只是发生在临时对象身上,但这个临时对象并未保存。
    这就引出一个概念存取字符串,数字或布尔值的属性时创建的临时对象叫做包装对象。
    知道了这个就可以区分什么时候字符串和字符串对象等等概念。具体有什么大的用处,我还真心不太了解。

    包装对象
    首先什么是包装对象,就是将普通的非对象的常规类型用某种方式包装成了一个对象
    答案是可以通过某些内置构造函数String()//Number()限时创建包装对象

    var S=new String("marry you");
    console.log(S); //String {0: "m", 1: "a", 2: "r", 3: "r", 4: "y", 5: " ", 6: "y", 7: "o", 8: "u", length: 9} 

    可以用==和===来区分是否是包装对象,==将原始值和包装对象视为相等,当"==="视为不等,也可以通过typeof

    原始值和对象有着根本的区别是,原始值是不可更改的。虽然字符串看上去有点例外。
    比如

    
    

    var s="marry me";
    console.log(s.toUpperCase()); //返回"MARRY"
    console.log(s); //"marry me" 但并没有改变s的值
    s=s.toUpperCase(); console.log(s); //MARRY ME

     

    原始值是无法更改的,任何方法都无法更改一个原始值,比如说通过指定索引来修改字符串中字符,javascript是禁止的。实际上返回给s的是一个新的字符串,之前的s其实是存在于内存中的,只不过没有被引用而已(有点小疑惑对应这个结论,多谢@泰山宏图的提醒)。

    对象转换为原始值

    那么怎么实现对象转化为原始值呢
    常见的有对象到字符串和数字到字符串等等
    所有对象继承了两个转换方法。
    第一个是toString()
      作用是返回一个反映这个对象的字符串。
    第二个是valueOf()
      作用是如果存在任意原始值,它就默认将对象转换为表示它的原始值。对象是复合值,而且大多数对象无法真正表示
    一个原始值,默认返回对象本身,非原始值。(其实这个知识点还可以挖的更深,对此我只能浅尝而止啦)
    例如:[1,2,4].toString();// "1,2,3"

    (function(x){console.log("marry you");}).toString(); //"function (x){console.log("marry you");}"
    new Date(2022,2,2).toString();//"Sat Mar 02 2222 00:00:00 GMT+0800 (中国标准时间)"
    
    var d=new Date(2020,2,22);
    d.valueOf();//1584806400000

    那么为啥会出现的不太一样呢,因为很多内置类都对toString()做了修改了。

    所以如果你要想使用toString()来反应这个对象的字符串类型
    Object.prototype.toString().call(obj);//这样得到的就是最原始的toString()的含义
    如:Object.prototype.toString.call([1,2,4]); //"[object Array]"
    如果你用[1,2,4].toString();//"1,2,4" 如果你得出这个鬼东西,我就只能安慰你,哥们不哭,站起来撸

    变量作用域

    在此简单说说变量的作用域
    首先变量的作用域是变量的作用范围区域,特别给从后端程序员转到前端的程序员说一点,此处的作用域不是用{}块级来
    区分作用域的,而是用一个function函数来区分作用域的也叫做函数块级作用域。
    比如for(var i=0;i<1;i++){console.log(i);} console.log("还是在这个作用域的i:",i)  //0,还是在这个作用域的i: 1

    首先函数体内,局部变量的优先级高于同名的全局变量。

    var a="global";
    function testscope(){
    var a="local";
    return a;
    }
    testscope();//"local"

    so作用域还有很多需要整理的,未完待续。如果你觉得对你有一点点帮助,求点推荐。如果没有,不要点推荐旁边的按钮。

    要不然我会来找你的...

  • 相关阅读:
    MySQL优化二 缓存参数优化
    Ant Design Pro 学习三 新建组件
    Ant Design Pro 学习二 新建菜单-布局
    因素空间从概率论、模糊集走向人工智能---汪培庄
    纪念L.A. Zadeh教授
    Configure the Stanford segmenter for NLTK
    navicat 连接sqlserver提示要安装 sql server native client
    CentOS6.5+nginx+tomcat负载均衡集群
    CentOS6.5安装mysql5.1.73
    linux64位操作系统装32位jdk解决方法
  • 原文地址:https://www.cnblogs.com/miniyk/p/3805158.html
Copyright © 2011-2022 走看看