JavaScript语言精粹之对象

Javascript的简单数据类型

        1.数字number

                JS不分整型和浮点型

                两个浮点数相加,精度不够

        2.字符串string     

        3.布尔值boolean 

        4.null

        5.undefined

        6.symbol

        以上都是简单数据类型

        其他都是对象 Function Array等

研究一下 前五个貌似是对象,因为他们拥有方法,但他们是不可变的?

数字、字符串、布尔值并不是对象,但是它们却拥有属性和方法。这是因为在引用它们的属性和方法时会分别通过调用new Number()new String()new Boolean()包装对象来转换成对象,该对象继承了对应的方法来处理属性的引用,一旦引用结束,便会销毁这个临时对象。nullundefined没有包装对象,访问它们的属性会报类型错误。

 例:console.log(typeof 1);  //number

        console.log(typeof new Number(1)); //object

        1===new Number(1) //fasle

这里把1包装成一个对象,这就是原始类型和包装对象的区别。

        let x = 32;

        console.log(x.toString(2));  //100000

方法和属性也可用于原始值,因为 JavaScript 在执行方法和属性时将原始值视作对象。

简单数据类型,不是对象

        let num = 1;

        console.log(typeof num);  //number

        let str = 'guo';

        console.log(typeof str);  //string

        let q = true;

        console.log(typeof q);  //boolean  

        let w = null;

        console.log(typeof w);  //object

        let e = undefined;

        console.log(typeof e);  //undefined

        let r = Symbol('big');

        console.log(typeof r);  //symbol

        console.log(num instanceof Object);  //false

        console.log(str instanceof Object);  //false

        console.log(q instanceof Object);  //false

        console.log(w instanceof Object);  //false

        console.log(e instanceof Object);  //false

        console.log(r instanceof Object);  //false

显然,简单数据类型不是对象。

        let strr = new String('guo');

        console.log(strr instanceof Object);  //true ‘字符串对象’

        num.name = 'xiao';

        console.log(num.name);  //undefined

        Object.prototype.last="原型链最末尾的";

        console.log(num.last);  //原型链最末尾的

        console.log(str.last);  //原型链最末尾的

        console.log(q.last);  //原型链最末尾的

        console.log(w.last);  //报错

        console.log(e.last);  //报错

        console.log(r.last);  //原型链最末尾的

简单数据类型不能添加属性,但是除了nullundefined,其他的都可以访问属性,所以他们拥有对象的特征,但其实还是简单数据类型而非对象。

JavaScript中的对象是可变的键控集合,除了简单类型外,其他的值都是对象。数组是对象,函数是对象,正则表达式是对象,对象也可以是对象。对象是无类别的且对新属性的名字和值没有约束。对象是属性的容器,每个属性都有keyvaluekey的值可以是包括空字符串在内的任意字符串,value的值是除undefined之外的任何值。

对象字面量

创建对象

        var empty_object = {};  //创建一个空对象

        var me = {

            "firstname": "guo",

            "lastname": "xiao",

            name: "xiaoguo",

            age: 19,

            state: {

                isSignle: true,

                sex: "男"

            }

        };  //当属姓名是一个合法的JavaScript标识符且不是保留字时,不强制要求用引号括住属性名

me.state  //{isSignle: true, sex: "男"}

me.state.sex  //"男"

对象可嵌套,属性的值可以从包括另一个对象字面量在内的任一表达式中获得。

检索

        console.log(me.state.sex);  //nan

        console.log(me["firstname"]);  //guo

        console.log(me.girlfriend);  //undefined

        var girl = me.girlfriend || "unappear";

        console.log(me.girlfriend);  //"unappear"

要检索对象里包含的值,可用以[ ]表达式,若字符串是合法标识符而非保留字,则也可用.调用,常规下,优先使用紧凑且可读性好的.调用.若尝试检索不存在的成员属性值,则返回undefined。利用运算符||可以进行默认值填充,&&运算符可避免检索一个undefined值时报错。

更新

对象中的值可以通过赋值语句来更新。若属性名已经存在,那么这个属性会被覆盖掉。若属性名已经存在,那么这个属性会被覆盖掉。

me.sex = '女';

me.boyfriend = 'xaioguo';

me.sex  //"女"

me.boyfriend  //"xaioguo"

引用

对象可通过引用来传递,但它们永远不会被复制

        var pickheart = me;

        me.age = 20;

        var onepiece = me;

        console.log(pickheart.age);  //20

        console.log(pickheart.age);  //20

a1,a2引用了不同的对象,因此也各不影响

        var a1 = {}, 

            a2 = {};

        a1 == a2  //false
        a1 === a2  //false        

原型

每个对象都关联到一个原型对象,并可从中继承相应属性。所有通过对象字面量创建的对象都连接到 Object.prototype,它也是 JavaScript 中的终点对象。当创建一个新对象时,可以选择某个对象为其原型,可以尝试给 Object 添加一个 beget 方法,它可以创建一个使用原对象作为其原型的新对象。

var me = {

            "firstname": "guo",

            "lastname": "xiao",

            name: "xiaoguo",

            age: 19,

            state: {

                isSignle: true,

                sex: "男"

            }

        }; 

if (typeof Object.beget !== 'function') {

            Object.beget = function (o) {

                var F = function () {};

                    F.prototype = o;

                    return new F();

            }

        }

        var he = Object.beget(me);

        console.log(he.name);  //xaioguo

反射

检查并确定对象具有的属性,进行检索并验证即可,通常使用typeof,但原型链的任何属性还会产生同一个值,为了处理掉这些不需要的属性,可以利用hasOwnProperty方法来检验是否是对象独有的属性,它将返回对应的布尔值,它不会检查原型链。

枚举

for (name in me) {

            if (typeof me.name !== 'function') {

                document.writeln(name + ':' + me.name);

            }

        }

for in 语句用来遍历对象中的所有属性名。该枚举过程会列出所有的属性(包括函数和原型链中的属性)同时一般利用 typeof 来排除不想要的函数。因为属性名的出现顺序是不确定的,若想确保特定顺序应完全避免for in 语句的使用,用for循环实现。

删除

delete运算符用来删除对象的属性,它会移除对象包含的属性,但不会对原型链产生影响。删除对象的属性,可能会让它原型链中的此属性浮现出来。

        he.age = 19;

        console.log(he.age);  //19

        delete he.age;

        console.log(he.age);  //20

减少全局变量污染

JavaScript可以随意定义全局变量,但同时会削弱程序的灵活性。一般只为应用创建唯一一个全局变量容器,把全局资源都归纳至一个名称空间下,则会显著降低命名冲突,减少全局污染。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值