深入js系列-类型(对象)
开篇
值的传递方式
1.值传递 表示传递过程中复制了值
2.引用传递 表示传递过程中传递的是值的引用
js的传递方式 值传递
看下面的例子
// 这里值传递很容易理解
var a = 1
var b = a // a = 1 b = 1
b = 3 // a = 1 b = 3
// 引用也是值传递
var a = [1,2,3];
var b = a;
a; // [1,2,3]
b; // [1,2,3]
// 然后
b = [4,5,6];
a; // [1,2,3]
b; // [4,5,6]
// 假如是引用传递
b = [4,5,6];
a; // [4,5,6]
b; // [4,5,6]
b=[4,5,6] 并不影响a 指向值[1,2,3],除非b 不是指向数组的引用,而是指向a 的指针,在C++你可以用指针来实现这种变化
但在JavaScript 中不存在这种情况!
如何生成对象
1.使用对象字面值
let person = {
age: 21
}
2.使用构造函数
function Person(age) {
this.age = age
}
let person = new Person(age)
我们先看一下原生构造函数
String() // 字符串
Number() // 数字
Boolean() // 布尔
Array() // 数组
Object() // 对象
Function() // 函数
RegExp() // 正则
Date() // 日期
Error() // 异常父类
Symbol()——ES6 中新加入的! // symbol
如何区分内置对象
所有typeof 返回值为"object" 的对象(如数组)都包含一个内部属性[[Class]],目前ES6这个属性改了名字,暂时没找到文献,不过行为是一致的
Object.prototype.toString.call( null )
// "[object Null]"
Object.prototype.toString.call( undefined )
// "[object Undefined]"
Object.prototype.toString.call( "abc" )
// "[object String]"
Object.prototype.toString.call( 42 )
// "[object Number]"
Object.prototype.toString.call( true )
// "[object Boolean]"
Object.prototype.toString.call( Symbol())
// "[object Symbol]"
Object.prototype.toString.call( {} )
// "[object Object]"
Object.prototype.toString.call( [1,2,3] )
// "[object Array]"
Object.prototype.toString.call( new Date() )
// "[object Date]"
Object.prototype.toString.call( new Error() )
// "[object Error]"
Object.prototype.toString.call( new Function () )
// "[object Function]"
Object.prototype.toString.call( /regex-literal/i );
// "[object RegExp]"
对象包装和拆封
默默无闻的对象包装和拆封,但很重要,注意下面的例子,"abc"是我经常使用的字符串表达方式,它是基本值,是没有.length和.toString方法的,需要把它封装成对象才能访问这些属性或者方法
// 自动包装前
var a = new String("abc")
a.length // 3
a.toUpperCase // ABC
// 自动包装后
var a = "abc"
a.length // 3
a.toUpperCase // "ABC"
一般情况下,最好是让js引擎来决定使用封装对象的时机,就是说我们优先考虑"abc"、42 而不是 new String("abc") new Number(42)
特殊情况 封装对象结果和基本值不同
var a = new Boolean( false ); // 对象是真值
if (!a) {
console.log( "Oops" ); // 执行不到这里
}
拆封
使用包装对象的valueof函数即可
var a = new String( "abc" );
var b = new Number( 42 );
var c = new Boolean( true );
a.valueOf(); // "abc"
b.valueOf(); // 42
c.valueOf(); // true
原生函数作为构造函数
1.Array() // new 在不写是会默认补全
var a = new Array( 1, 2, 3 );
a; // [1, 2, 3]
var b = [1, 2, 3];
b; // [1, 2, 3]
问题
Array作为构造函数时,单个参数被认为是预设数组的长度
1.这个异常行为很容易被人忘记导出容易犯错
2.预设长度会导致空数组,就是数组包含未赋值的元素,更严重的问题是,数组api对这种称为稀疏数组的行为不一致
var a = new Array( 3 ); // [empty * 3] 而不是 [3]
a.map((e, index) => index) // [empty * 3] 而不是 [0,1, 2]
a.join("-") // - -
生成指定长度undefined单元数组
var a = Array.apply( null, { length: 3 } );
a; // [ undefined, undefined, undefined ]
ES6 Array.from()
var a = Array.from({length: 3})
a; // [ undefined, undefined, undefined ]
2.Object()
使用Object构造对象,需要逐个赋值
var c = new Object();
c.foo = "bar";
c; // { foo: "bar" }
var d = { foo: "bar" };
d; // { foo: "bar" }
3.Function
需要在动态定义函数和函数体时才使用
var sum = new Function('a', 'b', 'return a + b');
console.log(sum(2, 6));
4.RegExp
在动态定义正则表达式时使用
var name = "Kyle";
var namePattern = new RegExp( "\\b(?:" + name + ")+\\b", "ig" );
var matches = someText.match( namePattern );
5.Date
用来获取时间戳
new Date().getTime()
// ES6 新API
Date.now
6.Error
获取函数调用栈信息和产生错误的代码行号
7.Symbol()
Symbol() /不能使用new
深入js系列-类型(对象)的更多相关文章
- 转:js不同类型对象的比较规则
Type(x) Type(y) Result type(x)==type(y) x===y otherwise... false null undefined true undefined null ...
- 深入js系列-类型(隐式强制转换)
隐式强制转换 在其可控的情况下,减少冗余,让代码更简洁,很多地方都进行了隐式转换,比如常见的三目表达式.if().for().while.逻辑运算符 || &&,适当通过语言机制,抽象 ...
- 深入js系列-类型(显式强制转换)
什么是显式 这里的显式和隐式是以普遍的标准来进行讨论的,你能看出来是怎么回事,那么它对你是"显式",相反你不知道的话,对你就是"隐式" 抽象操作 字符串.数字. ...
- 深入js系列-类型(数字)
开头 js数字没有明确区分浮点数和整数类型,统一用number类型表示. number 基于IEEE 754标准实现 js采用的是双精度(64位二进制) 我们看一个基于IEEE 754标准实现都有会有 ...
- 深入js系列-类型(null)
首先null是表示什么状态呢 这个是需要和上篇的undefined做一个区分 undefined 从未赋值 非关键词(也就是可以定义为变量名或者赋值给它) null 曾经赋值.目前没值 关键词 typ ...
- 深入js系列-类型(开篇)
思考 作为一个编程人员,你可能从来没仔细思考过,为什么这么多高级语言会有类型这东西. 实际上,类型有点类似生活中的类别,我们日常生活,早已经把这个概念理解到了,切肉和切水果会用不同的刀. 语言级别的类 ...
- js系列教程2-对象、构造函数、对象属性全解
全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...
- js中判断对象具体类型
大家可能知道js中判断对象类型可以用typeof来判断.看下面的情况 <script> alert(typeof 1);//number alert(typeof "2" ...
- js中推断对象详细类型
大家可能知道js中推断对象类型能够用typeof来推断. 看以下的情况 <script> alert(typeof 1);//number alert(typeof "2&quo ...
随机推荐
- Linux(centOS6.5)安装RabbitMQ
第一.下载erlang和rabbitmq-server的rpm: wget http://www.rabbitmq.com/releases/erlang/erlang-19.0.4-1.el7.c ...
- 一个简单的利用 HttpClient 异步下载的示例
可能你还会喜欢 一个简单的利用 WebClient 异步下载的示例 ,且代码更加新. 1. 定义自己的 HttpClient 类. using System; using System.Collec ...
- 另一种缓存,Spring Boot 整合 Ehcache
用惯了 Redis ,很多人已经忘记了还有另一个缓存方案 Ehcache ,是的,在 Redis 一统江湖的时代,Ehcache 渐渐有点没落了,不过,我们还是有必要了解下 Ehcache ,在有的场 ...
- 【BZOJ4487】[JSOI2015]染色问题(容斥)
[BZOJ4487][JSOI2015]染色问题(容斥) 题面 BZOJ 题解 看起来是一个比较显然的题目? 首先枚举一下至少有多少种颜色没有被用到过,然后考虑用至多\(k\)种颜色染色的方案数. 那 ...
- 【leetcode-200 深度优先+广度优先】 岛屿数量
给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均被水包围. 示例 1: 输入: ...
- 官方elasticsearch-certutiledit命令
地址:https://www.elastic.co/guide/en/elasticsearch/reference/7.5/certutil.html 语法: bin/elasticsearch-c ...
- C# 中 ==和equals的区别
不想说太多,直接上代码,这两个就没什么联系,有自己独立的规则.联系在一起其实不利于记忆. 下面是测试代码 Console.WriteLine("--equals和==的区别--") ...
- vue数据修改不同步更新的问题解决方案
最近在做一个组件封装的功能,用到父组件将数组(this.DataSource,this.DefaultItem)传到给子组件,子组件接受该数组来进行添加数组和删除数组的操作.因为子组件无法直接修改父组 ...
- html页面的渲染And<script>位置的影响
周末加班敲代码的时用到了<script>标签,突然想到了一个问题:别的自测项目里面<script>我把他放在了不同位置,这里应该会对代码的执行与渲染后影响吧?于是今天专门进行了 ...
- C#使用Redis实现网站统计访问数或点赞数功能!
1.安装.net操作Redis需要的NuGet包: 这里推荐使用:StackExchange.Redis,在程序包管理器控制台输入命令install-package stackexchange.red ...