对象数组

JavaScript中in操作符(for..in)、Object.keys()和Object.getOwnPropertyNames()的区别

本小妞迷上赌 提交于 2020-03-13 19:28:37
ECMAScript将对象的属性分为两种: 数据属性 和 访问器属性 。每一种属性内部都有一些特性,这里我们只关注对象属性的[[Enumerable]]特征,它表示是否通过 for-in 循环返回属性,也可以理解为:是否可枚举。 然后根据具体的上下文环境的不同,我们又可以将属性分为: 原型属性 和 实例属性 。原型属性是定义在对象的原型(prototype)中的属性,而实例属性一方面来自己构造函数中,然后就是构造函数实例化后添加的新属性。 本文主要介绍JavaScript中获取对象属性常用到的三种方法的区别和适用场景。 for..in循环 使用for..in循环时,返回的是所有能够通过对象访问的、可枚举的属性,既包括存在于实例中的属性,也包括存在于原型中的实例。这里需要注意的是使用for-in返回的属性因各个浏览器厂商遵循的标准不一致导致对象属性遍历的顺序有可能不是当初构建时的顺序。 遍历数组 虽然for..in主要用于遍历对象的属性,但同样也可以用来遍历数组元素。 var arr = ['a', 'b', 'c', 'd']; // 使用for..in for (var i in arr) { console.log('索引:' + i + ',值:' + arr[i]); } // 使用for循环 for (var j = 0; j < arr.length; j++) {

Java HashMap实现原理分析

末鹿安然 提交于 2020-03-13 09:20:18
参考链接:https://www.cnblogs.com/xiarongjin/p/8310011.html 1. HashMap的数据结构 数据结构 中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难; 链表 链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。 链表 的特点是:寻址困难,插入和删除容易。 哈希表 那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表。哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。   哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法—— 拉链法,我们可以理解为“ 链表的数组 ” ,如图:   从上图我们可以发现哈希表是由 数组+链表 组成的,一个长度为16的数组中,每个元素存储的是一个链表的头结点。那么这些元素是按照什么样的规则存储到数组中呢。一般情况是通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28

JavaScript 对象属性底层原理

泪湿孤枕 提交于 2020-03-13 09:14:38
对象属性类型 1. 数据属性 [[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,特性默认值为true [[Enumberable]]:表示能否通过for-in循环返回属性,特性默认值为true [[Wtiteable]]:表示能否修改属性的值,特性默认值为true [[Value]]:包含这个属性的数据值,读取属性值/写入属性值,从这个位置读/把新值保存在这个位置,这个特性的默认值为undefined 2. 访问器属性 [[configurable]]: 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,特性默认值为true [[Enumberable]]:表示能否通过for-in循环返回属性,特性默认值为true [[Get]]:在读取属性时调用的函数,默认值为undefined [[Set]]:在写入属性时调用的函数,默认值为undefined 3. 定义对象的访问器属性 - Object.defineProperty var book = { _year: 2004, edition: 1 }; Object.defineProperty(book, "year", { get: function(){ return 2018; },

ES6中新加命令

拈花ヽ惹草 提交于 2020-03-13 00:59:34
1.2、let 和 const 命令   var     var 有一个问题,就是定义的变量有时会莫名奇妙的成为全局变量。例如这样的一段代码: 1 for(var i = 0; i < 5; i++ ) { 2 console.log(i); 3 } 4 console.log("循环外” + i);            这样的变量成了全局变量,造成了困扰。     可以看出,在循环外部也可以获取到变量i的值,显然变量i的作用域范围太大了,在做复杂页面时,会带来很大的问题。    let      let 所声明的变量,只在 let 命令所在的代码块内有效。我们把刚才的 var 改成 let 试试: for(let i = 0; i < 5; i++){ console.log(i); }console.log("循环外:" + i)     这样,就把变量的i的作用域控制在了循环内部。 const     const 声明的变量是常量,不能被修改,类似于java中final关键字 const a = 1; console.log("q = ", a); // 给a 赋值 a = 2; console.log("a = " , a);     可以看到,变量a的值是不能修改的。 1.3、字符串扩展   在ES6中,为字符串扩展了几个新的API:   includes()

underscore.js源码解析【集合】

萝らか妹 提交于 2020-03-13 00:44:52
// Collection Functions // -------------------- // The cornerstone, an `each` implementation, aka `forEach`. // Handles raw objects in addition to array-likes. Treats all // sparse array-likes as if they were dense. /* params: 数组、对象或类数组对象,函数,函数执行环境 */ _.each = _.forEach = function(obj, iteratee, context) { iteratee = optimizeCb(iteratee, context); var i, length; if (isArrayLike(obj)) {// 数组或类数组 for (i = 0, length = obj.length; i < length; i++) { iteratee(obj[i], i, obj);// item index obj } } else {// 对象 var keys = _.keys(obj);// 返回键的数组 for (i = 0, length = keys.length; i < length; i++) {

JavaScript内置对象之数组

假装没事ソ 提交于 2020-03-12 21:28:41
一、JavaScript对象之数组   1、创建数组的方式     (1)使用Array构造函数        语法:new Array()       小括号()说明:         -预先知道数组要保存的项目数量         -向Array构造函数中传递数组应包含的项     (2)使用数组字面量表示法        -由一对包含数组项的方括号[]表示,多个数组之间以逗号隔开     2、数组元素的读写       -读取和设置值时,使用方括号[]并提供相应的索引        说明:索引是从0开始的正整数     3、数组的长度       语法:array.length       功能:获取数组array的长度       返回值:number       说明:         -通过设置length可以从数组的末尾移除或向数组中添加新项。         -把一个值放在超出当前数组大小的位置上时,会重新计算数组长度值,长度值等于最后一项索引加1。     4、数组方法的栈方法       push() unshift() pop() shift()      (1)push()        -语法:          arrayObject.push(newele1,newele2……newelen);        -功能:         

2.变量的解构赋值

*爱你&永不变心* 提交于 2020-03-12 11:38:29
变量的解构赋值 变量的解构赋值 数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。 以前,为变量赋值,只能直接指定值。 let a = 1; let b = 2; let c = 3; ES6 允许写成下面这样。 let [a, b, c] = [1, 2, 3]; 上面代码表示,可以从数组中提取值,按照对应位置,对变量赋值。 本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。下面是一些使用嵌套数组进行解构的例子。 let [foo, [[bar], baz]] = [1, [[2], 3]]; foo // 1 bar // 2 baz // 3 let [ , , third] = ["foo", "bar", "baz"]; third // "baz" let [x, , y] = [1, 2, 3]; x // 1 y // 3 let [head, ...tail] = [1, 2, 3, 4]; head // 1 tail // [2, 3, 4] let [x, y, ...z] = ['a']; x // "a" y // undefined z // [] 如果解构不成功,变量的值就等于 undefined 。 let [foo] = []

ES6 变量的解构赋值 (三)

僤鯓⒐⒋嵵緔 提交于 2020-03-12 06:40:48
1 数组的解构赋值 从数组和对象中提取值,对变量进行赋值,这被称为解构 let [a, b, c] = [1, 2, 3]; 2 对象的解构赋值 解构不仅可以用于数组,还可以用于对象。对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值.如果解构失败,变量的值等于 undefined 。 let { bar, foo } = { foo: 'aaa', bar: 'bbb' }; foo // "aaa" bar // "bbb" let { baz } = { foo: 'aaa', bar: 'bbb' }; baz // undefined 对象的解构赋值,可以很方便地将现有对象的方法,赋值到某个变量。与数组一样,解构也可以用于嵌套结构的对象 // 例一 let { log, sin, cos } = Math; // 例二 const { log } = console; log('hello') // hello 3 字符串的解构赋值 字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。 const [a, b, c, d, e] = 'hello'; a // "h" b // "e" c // "l" d // "l" e // "o" 4

JS数组定义及详解

三世轮回 提交于 2020-03-12 04:59:51
JS数组定义及详解 1、什么是数组 数组就是一组数据的集合 其表现形式就是内存中的一段连续的内存地址 数组名称其实就是连续内存地址的首地址 2、关于js中的数组特点 数组定义时无需指定数据类型 数组定义时可以无需指定数组长度 数组可以存储任何数据类型的数据(比如说一个元素保存整型,一个元素保存字符串型,这个在JS中是可以的) 创建数组的语法: var arr=[值1,值2,值3]; //隐式创建 var arr=new Array(值1,值2,值3); //直接实例化 var array=new Array(size); //创建数组并指定长度 JS中符号含义: ()表示函数执行 []表示语法模拟,表示模拟Array类的实例(=new Array()) {}表示语法模拟,表示模拟Object类的实例(=new Object()) //表示语法模拟(正则对象),表示模拟RegExp类的实例(=new RegExp()) 1 //方法一 2 var arr1 = [1,3,5,7,9]; 3 document.write(arr1[2] + '<br>'); 4 5 //方法二 6 var arr2 = new Array(2,4,6,8,10); 7 document.write(arr2[3] + '<br>'); 8 9 //方法三 10 var arr3 = new Array

数组,包装器类型

爱⌒轻易说出口 提交于 2020-03-11 14:49:26
包装器类型: java中对象 数据类型 基本数据类 byte short int long float double char boolean 引用数据类型 java是百分之百面向对象的编程语言。 Byte Short Integer Long Float Double Charactor Boolean null: 代表着空,即没有内存地址所引用。 所有的值为null的对象,如果调用了属性或者是方法,则会出现NullPointerException空指针异常。 ==: 比较运算符,比较两个数值是否相等(作用在基本数据类型的时候) 如果作用在两个对象之间,比较的是两个对象的内存地址是否相等。 java中的数组: 什么是数组? 一组相同类型的有序的长度固定的数据的集合。 java中将数组看作是一个对象。 java中按照维度不同分为: 一维数组 二维数组 ... 多维数组 一维数组: 语法: 1.类型[] 数组对象名称 = {数据1,数据2,...,数据n}; 相同类型: 指的是数组中所包含的元素,都必须是统一的一个类型的元素。 有序: 指的是,数组的下标(索引)有序,数组的下标永远从0开始,到数组的长度-1结束。每一个下标之间+1. 数组的长度: 指的是数组中所包含元素的个数。 如何取出数组中的某一个元素: 数组对象名称[下标] 将数组中的每一个元素都可以当做是一个变量来看待。