初识JS-2

JS默认提供了很多类

Number类
   var n=new Number("100");
   console.log(n); //Number {100}
   console.log(typeof n);//typeof查看对象的数据类型,object
   console.log(n instanceof Number);//true
   //instanceof是一个运算符,判断一个对象是否属于某个类
String类
   var s=new String("hello world");
   console.log(s); //String {hello world}
   console.log(typeof s);//typeof查看对象的数据类型,object
   console.log(s instanceof String);//true
   console.log(s instanceof Number);//false
   //instanceof是一个运算符,判断一个对象是否属于某个类
Boolean类
   var b=new Boolean(true);
   console.log(b); //Boolean {true}
   console.log(typeof b);//typeof查看对象的数据类型,object
   console.log(b instanceof Boolean);//true
   //instanceof是一个运算符,判断一个对象是否属于某个类
Object类
  //想要写一个对象,都需要通过new一个构造器(类),得到一个对象
 var obj=new Object(); //new一个构造器得到一个对象
  obj.name="wc";
  obj.age=100;
  console.log(obj);//obj{name:"wc",age:100}

  //下面写法是上面写法的语法糖(简写方式)
  //字面量形式声明一个对象
  var obj ={
      name:"wc",
      age:100,
  }
  console.log(obj);//obj{name:"wc",age:100}
Date类
   var d=new Date();
    console.log(d);//输出当前系统时间
    console.log(d.getFullYear());
    console.log(d instanceof Date);// true
Array类
  //Array是一个内置类 
    var arr = new Array("a","b","c");
    console.log(arr);
    console.log(arr instanceof Array);//true

     // 是上面的形式的语法糖
    var arr2 = ["d","e","f"];  // 字面量创建数组(对象)
    console.log(arr2); // ["d", "e", "f"]

JS中的一切都是对象

证明1:html元素是一个对象
<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
</ul>
<script>
    //证明一:html元素是一个对象
    //只要能打点调用就能证明该元素是对象
    let lis = document.getElementsByTagName("li");
    console.log(lis);
    console.dir(lis[0]);
    //console.dir()可以显示一个对象的所有属性和方法
</script>
证明2:数组是一个对象
// 证明二:数组也是对象   对象里面有一堆的属性和方法
    var arr = ["a","b","c"]; // 也是Array这个类
    console.log(arr); // ["a", "b", "c"]
    console.dir(arr);
    console.dir(typeof arr); // object
    console.log(arr.length);
    arr.push("d");
    console.log(arr);
    console.log(arr instanceof Array); // true
证明3:函数是一个对象
 // 证明3:函数也是对象
    function f(a,b) {
        console.log("f...");
        return "f.....";
    }
    console.dir(f)
    console.dir(f.name)
    console.log(f().length)//5
    f.call()
    f.apply()
    f.bind()
    console.log(f instanceof Function); // true
    console.log(typeof f); // function
证明4:基本数据类型是一个对象
// 证明4:基本数据类型也是对象(基本数据类型在某些情况下也是对象)
    var a = 110; // 现在要证明a也是对象
    console.dir(a);  // 110
    console.log(typeof a) // number
    console.log(a instanceof Number) // false

    // 如果a不是对象  是不可能打点调用toFiexed
    console.log(a.toFixed(3)); // 110.000
    // 上面的a叫包装对象
    // 上面调用toFixed时,它会把a瞬间包装成一个对象

    var str = "hello";
    console.log(str.length);  // 5  str也是瞬间包装成对象了
    console.log(str.toUpperCase()); // HELLO

对象中的属性有4大特征

1.configurable 表示是否可以被删除  true表示可以删除
2.writable 表示是否可以修改  true表示可以修改
3.enumerable 是否可以枚举  true表示可以输出
4.value 属性值  默认是undefind

   var obj = {
        name: "小张",
    }
    console.log(Object.getOwnPropertyDescriptor(obj, "name"));
    //Object.getOwnPropertyDescriptor(obj,prop)获取属性的特征
    //obj查找目标对象,prop对象中的属性名。
    // value: "小张"
    // configurable: true
    // writable: true
    // enumerable: true
    obj.age = 21;
    //给一个对象添加一个属性时,也可以设置上面的4个特征
    // Object.defineProperty()
    console.log(obj);
    console.log(Object.getOwnPropertyDescriptor(obj, "age"));
    //value: 21
    //configurable: true
    //enumerable: true
    //writable: true
    Object.defineProperty(obj, "age",{
    value: 22,
    configurable: false,
    enumerable: true,
    writable: false,
    });
    console.log(Object.getOwnPropertyDescriptor(obj, "age"));
    // value: 22,
    // configurable: false,
    // enumerable: true,
    // writable: false,
    
    
    var a = 10;
    console.log(Object.getOwnPropertyDescriptor(window, "a"));
    //value: 10
    //configurable: false
    //writable: true
    //enumerable: true

属性的分类

对象上的属性可以分为两类:
1.公有属性
2.私有属性
可以通过一个API可以查看一个属性是否是私有属性
hasOwnProperty();会返回一个布尔值,true为私有函数,false为公有函数

  var obj ={
        name:"小张",
        age:100,
    }
    //hasOwnProperty("name")看name是否是obj的私有属性
    console.log(obj.hasOwnProperty("name"));//true 是obj的私有属性
    console.log(obj.hasOwnProperty("age"));//true 是obj的私有属性
    console.log(obj.hasOwnProperty("toString"));//false 是obj的公有属性
    console.log(obj.hasOwnProperty("__proto__")); // false 查看__proto__是否是obj的公有属性
    console.log(obj.__proto__.hasOwnProperty("toString")); // true  查看toString是否是obj.__proto__这个对象的私有属性
    // 对于obj来说:name和age是它的私有属性  toString是它的公有属性
    // 对于obj.__proto__来说:toString是它的私有属性
    // 也就是说一个属性是私有属性还是公有属性,还需要看它针对是谁。

    var arr = ["a","b"];
    console.dir(arr);
    console.log(arr.hasOwnProperty("length")); // true
    console.log(arr.hasOwnProperty("push")); // false
    console.log(arr.hasOwnProperty("__proto__")); // false
    console.log(arr.__proto__.hasOwnProperty("push")); // true
    // delete只能删除私有属性  不能删除公有属性
    delete arr[0];
    console.log(arr);
    delete arr.push;
    console.dir(arr)
    //判断一个属性是否属于某个对象用in
    console.log(length in arr);//true:length是arr的属性

函数的4种角色

角色一:一个普通的函数
角色二:在对象中可以当成一个方法
角色三:类 构造器
角色四:也可以当作一个对象

    //角色一:一个普通函数
    function f() {
        console.log("f...");
    }
    f();//作用1:让函数体执行  作用2;得到返回值

    //角色二:在对象中可以当成一个方法
    let obj = {
        say: function () {  // 方法
            console.log("say...")
        },
        sleep: function () { // 方法
            console.log("sleep...")
        }
    }
    obj.say();
    obj.sleep();
    
    //角色三:类  构造器
    function NBAPlayer() {
    }
    var nbaPlayer1 = new NBAPlayer();
    var nbaPlayer2 = new NBAPlayer();
    var nbaPlayer3 = new NBAPlayer();
    console.log(nbaPlayer1);
    console.log(nbaPlayer2);
    console.log(nbaPlayer3);

    //角色四:也可以当作一个对象
    function F(){
    }
    F.name1="咪咪";
    F.age1=2;
    console.log(F.name1);
    console.log(F.age1);
让函数充当一个类
    // 在JS中,函数也是一个类
    function f(name) {
        this.name = name;
    }
    // new f时  f后面的()可写可不写
    // 区别:写的话可以传递参数
    let obj = new f("wc");
    let obj2 = new f;
    console.log(obj.name);//wc
    console.log(obj2);//f {name: undefined}


    function NBAPlayer(name) {  // 类
        // console.log(this)
        this.name = name;
    }
    // new 运算符 肯定干几件事
    //    1)在构造器内部创建一个空对象
    //    2)让构造器中的this指向这个对象
    //    3)返回这个对象
    var p1 = new NBAPlayer("乔丹");
    var p2 = new NBAPlayer("科比");
    console.log(p1.name);//乔丹
    console.log(p2.name);//科比

    function F() {
        // 不官你这里返回了什么,只要是new,返回的肯定是一个对象
        return 123;
    }
    // 如果你new了,函数内部的返回值直接忽略
    let o = new F();
    console.log(o)
toString用法

一个小问题:什么情况下,让a可以等于1,也可以等于2,也可以等于3?
  首先,a==1,==比较运算符,如果说a是一个number,直接比较相等就是true,否则就是false。
  如果a不是number,两侧的数据类型就不一样,==强制要求,要比较就必须保证两侧操作数的数据类型一致,先转化为相同数据类型,然后再进行比较。

    var a={name:"wc"};
    console.log(a==1);//false
    // 如果a是一个对象,先把a转成字符串,字符串和number类型还是不一样
    // 然后尝试把字符串尝试转成数字,最后进行比较

  也就是说对象和一个数字进行比较时,先把对象转成了字符串,再转成数字,最终还是数字和数字进行比较。在转字符串时,它会默认调用一个方法,叫toString。

    let a={
        n:0, //a对象的私有属性
        toString:function(){  //a对象的私有属性(方法)
            console.log("这是自己的toString...");
            //this==>a
            return ++this.n;
        }
    }
    console.log(a==1);//true
    console.log(a==2);//true
    console.log(a==3);//true


    let a = [1,2,3];
    // ....   shift
    a.toString = a.shift; // 你调用toString就相当于调用了shift
    //shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值
    // a==1  先调用a.toString  内部调用了
    if(a==1 && a==2 && a==3){
        console.log("ok");
    }

注意:不只Object的原型对象上有toString,其它的构造器的原型对象上也有toString。
一个对象在调用toString时,如果它的原型上有toString方法,就调用它的原型上的toString。没有的话,和会找Object的原型对象上的方法。

    // toString的作用:
    let obj = {name:"wc"};
    // 1)此toString中的this是指obj
    console.log(obj.toString()); // [object Object]  它的调用的是Object.prototype.toString()
    let arr1 = [1,2,3];
    console.log(arr1.toString()); // 1,2,3  它调用的是Array.prototype.toString()
    let f = function () {}
    console.log(f.toString()); // function () {}  Function.prototype.toString()
    // 除了Object的原型对象上的toString之外,其它的构造器上面也有toString方法,
    // 一个对象在调用toSring时,如果它的原型上有toString方法,就调用它的原型上的toString。没有的话,和会找Object的原型对象上的方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值