JavaScript中具有几个简单数据类型:数字number、字符串string、布尔值boolean、null值以及undefined值。除此之外其余所有值(包括数组Array、函数Function,甚至正则表达式RegExp)都是对象。JavaScript是一门完全基于对象的语言,因此每次学习JavaScript的时候,就要摸摸自己的脑袋,暂时清空一下以前关于类的概念,尤其是要解决原型的关系问题的时候。

1. 对象的简单介绍与一些注意事项

  数字、字符串以及布尔值表面是对象(因为当你声明变量引用它们时,你会发现它们具有方法),但其实它们是不可变的,只是JavaScript在处理引用数字、字符串或者布尔值时,通过调用new Number()、new String()和new Boolean()构造器将其转换为了数字、字符串或布尔对象,它自有的方法也是从这几个构造函数的原型中继承得到的。基本数据类型不可以被改变,因此在没有指针再指向它时,它在内存中占用的资源自动被释放,对象却永远以引用的方式传递,改变对象中的值,也就改变了它在内存中的值。

  注:理论上说,null值就是null值,不应该被检测为对象,但实际上,由于JavaScript的设计失误, typeof null === "object" 是一个事实。

  因此在检验null值时,尽量要使用其他方法。假如放到if语句中,一般对象会返回true,而null值会返回false。这样我们就可以使用 !null === true 进行检测了。例如,要检测一个刚获取的DOM对象是否正常取值,我们应该使用如下的代码:

 var element = document.getElementById("elementID");
if(element){}
// 或者if(!element){}

  而不要使用:

 var element = document.getElementById("elementID");
if(typeof element !== "object") {}
// 或者if(typeof element === "object") {}

  上面说到,因为 typeof null === "object" ,下面这段代码中,即使element获取不正常(即值为null)时,if语句也会按照获取正常的结果办事。

2. 对象的属性

  对象存在的意义就是它可以有许多的属性和方法帮助我们表达逻辑。对象的属性可以为任意的值,可以是数字、字符串、布尔值、null值,也可以是对象或者是函数(当然函数本质上也是对象)。输出一个属性,如果它已经被定义,但是一个null值,就会对应输出null,如果它甚至还未被定义,就会对应输出undefined。

  我们先用字面量定义一个对象,方便后面的测试:

 var game = {
name: "Mini Warior",
id: 201907271234,
qualification: {
type: "test"
}
}

  我们对对象属性的操作一般来说就是CURD,最常用的就是修改更新和检索取值。

  修改更新一个对象的属性,我们可以直接使用赋值语句。而一般检索并获取对象的属性,有两种方法:第一种,因为更紧凑可读性更强而最为常用的一种: var gameName = game.name; 我们称为(这里有个点↘). 表示法;第二种,就像获取数组对应下标的值一样: var gameName = game["name"]; 。检索获取属性值时,我们也要考虑到属性不存在的情况,这时候我们可以巧用运算符填充默认值: var gameName = game.name || "Mini Warior"; 。这时候如果game.name获取为null值或undefined值,gameName也会被赋值为你所希望的初始值,而不会影响接下来代码的运行。如果我们尝试从undefined的属性中取值,例如 var gameQualiPlayer = game.qualification.player; ,JavaScript将会抛出一个“TypeError”的错误,我们也可以巧用&&运算符: var gameQualiPlayer = game.qualification && game.qualification.player; 避免错误,但结果仍然是取出一个undefined值。

  处理一些不需要的属性时,假如期望遍历对象的所有属性,我们就需要把对象方法过滤掉,这个时候我们会使用 typeof propertyName ==='function' 。

  如果是要过滤掉原型上的属性,我们通常使用的办法是Object.prototype.hasOwnProperty()方法。这个方法会返回布尔值,值为填入的参数是否在当前的对象中。比较常用的用法是在使用for in语句遍历对象时,for in语句默认会遍历到原型链上的属性。假如在开发过程中原型链上的属性被其他人修改,而你不清楚,就会发生莫名的错误。没有添加hasOwnProperty方法进行过滤时:

 function Player(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
} Player.prototype.getName = function() {
return this.name;
} var player = new Player('MotherLyn', 3, 'male'); var playerPropertyName = [];
var playerProperty = []; for (var key in player){
playerPropertyName.push(key);
playerProperty.push(player[key]);
}

  打印发现,两个数组中均存在getName相关内容。下面使用Object.prototype.hasOwnProperty()过滤:

 function Player(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
} Player.prototype.getName = function() {
return this.name;
} var player = new Player('MotherLyn', 3, 'male'); var playerPropertyName = [];
var playerProperty = []; for (var key in player){
if(player.hasOwnProperty(key)){
playerPropertyName.push(key);
playerProperty.push(player[key]);
}
}

  这样,在遍历过程中,就不会把getName这个方法的键和值存到对应数组里面。

  对象的属性有的可枚举,有的不可枚举。像我们上面这样使用for in语句遍历一个对象时,所有可枚举的属性或方法都会受到影响,因此我们提到可以使用typeof关键字或hasOwnProperty方法进行过滤。但我们知道,JavaScript中Array也是对象,我们建立数组,输出它,会发现数组的下标是键,值是值,还有一个不可枚举的length属性(当然还有原型)。在这种情况下,我们使用for in语句就不会影响到length属性。for in语句不仅容易遍历到方法和原型属性,还无法控制属性名的顺序,因此我们遍历的最佳实践应该是使用普通的for语句而不是for in语句(当然,当讲到闭包时,我们也会发现for语句也并不是完美的,但至少它在大多数情况下都比for in遍历要好)。

  至于对象属性的删除,我们会使用到delete运算符,需要注意的一点就是它将不会触及到原型链里的内容,但删除此对象的属性后,可能会让原型链的属性浮现:假设我们有一个player对象,它有一个属性nickname: "Lyn",它的原型上也有一个属性nickname: "Ben",经过 delete player.nickname; 后,输出player.nickname的值为Ben。

  对象帮助我们编写可扩展、可重用、高质量的JavaScript库。但当然,对象还有几个重要的问题是原型链和对象的创建方法种类,它值得我们放到一篇新的博客中讲述。

  总结: ① 在JavaScript中,有五个基本类型,分别是:number、string、boolean、null和undefined,除此之外其余全是对象。对于这五个基本类型,它本身不可修改,但在声明变量引用它们时,JavaScript会自动调用对应的构造器将其转化成对象,因此在使用者看来会有一种它们都是对象的错觉。

         ② 熟悉对象属性方法的声明和取值方法。

         ③ 合理使用typeof关键字、hasOwnProperty方法等判断是否正常取值,以及处理不正常取值得到的结果。

林大妈的JavaScript基础知识(三):JavaScript编程(1)对象的更多相关文章

  1. 【javascript基础知识】javascript中的转义序列和特殊数值常量

    javascript的转义序列 \0 NUL字符(\u0000) \b 退格符(\u0008) \t 水平制表符(\u0009) \n 换行符(\u000A) \v 垂直制表符(\u000B) \f ...

  2. JavaScript基础知识(JSON、Function对象、原型、引用类型)

    19.JSON 概念:JavaScript 对象表示法(JavaScript Object Notation),是一种轻量级的数据交换格式  特点:易于程序员编写和查看:易于计算机解析和生成 数据结构 ...

  3. JavaScript 基础知识(一):对象以及原型

    前言 JavaScript 常被描述为一种基于原型的语言--每个对象拥有一个原型对象,对象以其原型为模板.从原型继承方法和属性.原型对象也可能拥有原型,并从中继承方法和属性,一层一层.以此类推.这种关 ...

  4. Javascript 基础知识学习--javascript中的参数传递都是按值传递的

    ECMAScript中所有函数的参数传递都是按值传递的,无论参数是值类型还是引用类型的.过去我跟大多数人一样觉得跟传值类型相关. 自己写了一个测试的例子,确实如此 function add(a) { ...

  5. 学习javascript基础知识系列第二节 - this用法

    通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...

  6. 学习javascript基础知识系列第三节 - ()()用法

    总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...

  7. Javascript基础知识总结一

    Javascript基础知识总结一 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...

  8. JavaScript基础知识(一)

    一.JavaScript基础 1.JavaScript用法: HTML 中的脚本必须位于 <script> 与 </script> 标签之间. 脚本可被放置在 HTML 页面的 ...

  9. JavaScript基础(三)

    十三.JS中的面向对象 创建对象的几种常用方式 1.使用Object或对象字面量创建对象 2.工厂模式创建对象 3.构造函数模式创建对象 4.原型模式创建对象 1.使用Object或对象字面量创建对象 ...

  10. javascript 基础知识学习1

    JavaScript 是脚本语言.浏览器会在读取代码时,逐行地执行脚本代码.而对于传统编程来说,会在执行前对所有代码进行编译.基础知识:1).JavaScript 对大小写敏感.JavaScript ...

随机推荐

  1. php生成html静态文件

    现在的动态网站存在很多性能上的弊端,seo优化会存在一定的瓶颈,现在将动态的网站代码转换为html静态文件,是浏览器通过html间接的读取动态网站源文件,这对其网站加载速度还是seo优化有着举足轻重的 ...

  2. 零基础配置Hadoop集群——Ambari安装及配置详解

    1. 准备工作 1.1. 系统环境 主机列表: IP地址 HostName 描述 192.168.610.153 ambari.server Ambari服务器 192.168.10.152  had ...

  3. 使用wait/notify实现线程间的通信

    之前对Java多线程中的wait/notify机制理解都不是很清晰,最近看了一本技术书,通过里面的讲解再配上一些博客,终于算是对wait/notify有了进一步的理解. 下面就来说说我对这两个方法的认 ...

  4. 为什么建议大家使用 Linux 开发

    Linux 能用吗? 我身边还有些朋友对 linux 的印象似乎还停留在黑乎乎的命令行界面上.当我告诉他或者建议他使用 linux 时,会一脸惊讶的问我,那个怎么用(来开发或者日常使用)? Linux ...

  5. Python连载20-偏函数&zip函数&enumerate函数

    一. 偏函数 二. #先举个例子 #把字符串转换为十进制数字 int(') #help(int),int函数中有一个参数base代表把它转换某个进制的数字 #把八进制的字符串转换为十进制 eight ...

  6. SSM框架学习笔记_第1章_SpringIOC概述

    第1章 SpringIOC概述 Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架. 1.1 控制反转IOC IOC(inversion of controller)是一种概念 ...

  7. POJ 3686:The Windy's(最小费用最大流)***

    http://poj.org/problem?id=3686 题意:给出n个玩具和m个工厂,每个工厂加工每个玩具有一个时间,问要加工完这n个玩具最少需要等待的平均时间.例如加工1号玩具时间为t1,加工 ...

  8. HDU 1811:Rank of Tetris(并查集+拓扑排序)

    http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description   自从Lele开发了Rating系 ...

  9. Yarn原理

    欢迎关注我的公众号<小沈干货>,谢谢大家. 一.可以将YARN看作是分布式操作系统,在大数据组件中,YARN的定位是: 1)集群资源管理中心 2)任务调度中心 YARN的功能进一步可以细化 ...

  10. Java虚拟机详解(三)------垃圾回收

    如果对C++这门语言熟悉的人,再来看Java,就会发现这两者对垃圾(内存)回收的策略有很大的不同. C++:垃圾回收很重要,我们必须要自己来回收!!! Java:垃圾回收很重要,我们必须交给系统来帮我 ...