如何用javascript 数组去重,定义一个函数,函数将返回一个由n项组成的自然数列的数组 我大概知道点求个详细版的解释

有趣的JavaScript原生数组函数
在Script中,可以通过两种方式创建数组,构造函数和数组直接量, 其中后者为首选方法。数组对象继承自Object.prototype,对数组执行typeof操作符返回&object&而不是&array&。然而执行[] instanceof Array返回true。此外,还有类数组对象是问题更复杂,如字符串对象,arguments对象。arguments对象不是Array的实例,但却有个length属性,并且值能通过索引获取,所以能像数组一样通过循环操作。
在本文中,我将复习一些数组原型的方法,并探索这些方法的用法。
循环.forEach
断言.some和.every
.join和.concat的区别
栈和队列.pop,.push,.shift和.unshift
模型映射.map
查询.filter
计算.reduce和.reduceRight
复制.slice
万能的.splice
查找.indexOf
走进.reverse
如果你想测试上面的例子,您可以复制并粘贴到您的的控制台中。
循环.forEach
这是原生数组方法中最简单的方法。不用怀疑,IE7和IE8不支持此方法。
forEach方法需要一个回调函数,数组内的每个元素都会调用一次此方法,此方法需要三个参数如下:
value 当前操作的数组元素
index 当前操作元素的数组索引
array 当前数组的引用
此外,可以传递可选的第二个参数,作为每个调用函数的上下文(this)。
['_', 't', 'a', 'n', 'i', 'f', ']'].forEach(function (value, index, array) {
& & this.push(String.fromCharCode(value.charCodeAt() + index + 2))
}, out = [])
out.join('')
// &- 'awesome'
.join函数我将在下文提及,上面例子中,它将数组中的不同元素拼接在一起,类似于如下的效果:out[0] + '' + out[1] + '' + out[2] + '' + out[n]。
我们不能用break中断forEach循环,抛出异常是不明智的方法。幸运的是,我们有其他的方法中断操作。
断言.some和.every
如果你曾经用过.NET的枚举,这些方法的名字和.Any(x =& x.IsAwesome) 和 .All(x =& x.IsAwesome)非常相似。
这些方法和.forEach类似,需要一个包含value,index,和array三个参数的回调函数,并且也有一个可选的第二个上下文参数。MDN对.some的描述如下:
some将会给数组里的每一个元素执行一遍回调函数,直到有一个回调函数返回true位置。如果找到目标元素,some立即返回true,否则some返回false。回调函数只对已经指定值的数组索引执行;它不会对已删除的或未指定值的元素执行。
max = -Infinity
satisfied = [10, 12, 10, 8, 5, 23].some(function (value, index, array) {
& & if (value & max) max = value
& & return value & 10
console.log(max)
// &- true
注意,当回调函数的value & 10 条件满足时,中断函数循环。.every的工作行为类似,但回调函数要返回false而不是true。
.join和.concat的区别
.join方法经常和.concat混淆。.join(分隔符)方法创建一个字符串,会将数组里面每个元素用分隔符连接。如果没有提供分隔符,默认的分隔符为&,&。.concat方法创建一个新数组,其是对原数组的浅拷贝(注意是浅拷贝哦)。
.concat 的标志用法:array.concat(val, val2, val3, valn)
.concat 返回一个新书组
array.concat()没有参数的情况下,会返回原数组的浅拷贝
浅拷贝意味着新数组和原数组保持相同的对象引用,这通常是好事。例如:
var a = { foo: 'bar' }
var b = [1, 2, 3, a]
var c = b.concat()
console.log(b === c)
// &- false
b[3] === a && c[3] === a
// &- true
栈和队列.pop,.push,.shift和.unshift
每个人都知道向数组添加元素用.push。但你知道一次可以添加多个元素吗?如下[].push('a', 'b', 'c', 'd', 'z')。
.pop方法和.push成对使用,它返回数组的末尾元素并将元素从数组移除。如果数组为空,返回void 0(undefined)。使用.push和.pop我们能轻易模拟出LIFO(后进先出或先进后出)栈。
function Stack () {
& & this._stack = []
Stack.prototype.next = function () {
& & return this._stack.pop()
Stack.prototype.add = function () {
& & return this._stack.push.apply(this._stack, arguments)
stack = new Stack()
stack.add(1,2,3)
stack.next()
相反,我们可以用.unshift 和 .shift模拟FIFO(先进先出)队列。
function Queue () {
& & this._queue = []
Queue.prototype.next = function () {
& & return this._queue.shift()
Queue.prototype.add = function () {
& & return this._queue.unshift.apply(this._queue, arguments)
queue = new Queue()
queue.add(1,2,3)
queue.next()
用.shift或.pop能很容易遍历数组元素,并做一些操作。
list = [1,2,3,4,5,6,7,8,9,10]
while (item = list.shift()) {
& & console.log(item)
模型映射.map
map 方法会给原数组中的每个元素(必须有值)都调用一次 callback 函数.callback 每次执行后的返回值组合起来形成一个新数组. callback函数只会在有值的索引上被调用; 那些从来没被赋过值或者使用delete删除的索引则不会被调用。&&MDN
Array.prototype.map方法和上面我们提到的.forEach,.some和.every有相同的参数:.map(fn(value, index, array), thisArgument)。
values = [void 0, null, false, '']
values[7] = void 0
result = values.map(function(value, index, array){
& & console.log(value)
& & return value
// &- [undefined, null, false, '', undefined & 3, undefined]
undefined & 3 值解释.map不会在没被赋过值或者使用delete删除的索引上调用,但他们仍然被包含在结果数组中。map在遍历或改变数组方面非常有用,如下所示:
[1, '2', '30', '9'].map(function (value) {
& & return parseInt(value, 10)
// 1, 2, 30, 9
[97, 119, 101, 115, 111, 109, 101].map(String.fromCharCode).join('')
// &- 'awesome'
// 一个映射新对象的通用模式
items.map(function (item) {
& & return {
& & & & id: item.id,
& & & & name: computeName(item)
查询.filter
filter对每个数组元素执行一次回调函数,并返回一个由回调函数返回true的元素 组成的新数组。回调函数只会对已经指定值的数组项调用。
用法例子:.filter(fn(value, index, array), thisArgument)。把它想象成.Where(x =& x.IsAwesome) LINQ expression(如果你熟悉C#),或者SQL语句里面的WHERE。考虑到.filter仅返回callback函数返回真值的值,下面是一些有趣的例子。没有传递给回调函数测试的元素被简单的跳过,不会包含进返回的新书组里。
[void 0, null, false, '', 1].filter(function (value) {
& & return value
[void 0, null, false, '', 1].filter(function (value) {
& & return !value
// &- [void 0, null, false, '']
排序.sort(比较函数)
如果未提供比较函数,元素会转换为字符串,并按字典许排列。例如,在字典序里,&80&排在&9&之前,但实际上我们希望的是80在9之后(数字排序)。
像大部分排序函数一样,Array.prototype.sort(fn(a,b))需要一个包含两个测试参数的回调函数,并且要产生一下三种返回值之一:
如果a在b前,则返回值小于零
如果a和b是等价的,则返回值等于零
如果a在b后,则返回值大于零
[9,80,3,10,5,6].sort()
// &- [10, 3, 5, 6, 80, 9]
[9,80,3,10,5,6].sort(function (a, b) {
& & return a - b
// &- [3, 5, 6, 9, 10, 80]
计算.reduce和.reduceRight
首先reduce函数不是很好理解,.reduce从左到右而.reduceRight从右到左循环遍历数组,每次调用接收目前为止的部分结果和当前遍历的值。
两种方法都有如下典型用法:.reduce(callback(previousValue, currentValue, index, array), initialValue)。
previousValue是最后被调用的回调函数的返回值,initialValue是开始时previousValue被初始化的值。currentValue 是当前被遍历的元素值,index是当前元素在数组中的索引值。array是对调用.reduce数组的简单引用。
一个典型的用例,使用.reduce的求和函数。
Array.prototype.sum = function () {
& & return this.reduce(function (partial, value) {
& & & & return partial + value
[3,4,5,6,10].sum()
上面提到如果想把数组连成一个字符串,可以使用.join。当数组的值是对象的情况下,除非对象有能返回其合理值的valueof或toString方法,否则.join的表现和你期望的不一样。然而,我们可以使用.reduce作为对象的字符串生成器。
function concat (input) {
& & return input.reduce(function (partial, value) {
& & & & if (partial) {
& & & & & & partial += ', '
& & & & return partial + value
& & }, '')
& & { name: 'George' },
& & { name: 'Sam' },
& & { name: 'Pear' }
// &- 'George, Sam, Pear'
复制.slice
和.concat类似,调用.slice缺省参数时,返回原数组的浅拷贝。slice函数需要两个参数,一个是开始位置和一个结束位置。
Array.prototype.slice能被用来将类数组对象转换为真正的数组。
Array.prototype.slice.call({ 0: 'a', 1: 'b', length: 2 })
// &- ['a', 'b']
除此之外,另一个常见用途是从参数列表中移除最初的几个元素,并将类数组对象转换为真正的数组。
function format (text, bold) {
& & if (bold) {
& & & & text = '&b&' + text + '&/b&'
& & var values = Array.prototype.slice.call(arguments, 2)
& & values.forEach(function (value) {
& & & & text = text.replace('%s', value)
& & return text
format('some%sthing%s %s', true, 'some', 'other', 'things')
// &- &b&somesomethingother things&/b&
万能的.splice
.splice是我最喜欢的原生数组函数之一。它允许你删除元素,插入新元素,或在同一位置同时进行上述操作,而只使用一个函数调用。注意和.concat和.slice不同的是.splice函数修改原数组。
var source = [1,2,3,8,8,8,8,8,9,10,11,12,13]
var spliced = source.splice(3, 4, 4, 5, 6, 7)
console.log(source)
// &- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ,13]
// &- [8, 8, 8, 8]
你可能已经注意到,它也返回被删除的元素。如果你想遍历已经删除的数组时这可能会派上用场。
var source = [1,2,3,8,8,8,8,8,9,10,11,12,13]
var spliced = source.splice(9)
spliced.forEach(function (value) {
& & console.log('removed', value)
// &- removed 10
// &- removed 11
// &- removed 12
// &- removed 13
console.log(source)
// &- [1, 2, 3, 8, 8, 8, 8, 8, 9]
查找.indexOf
通过.indexOf,我们可以查找数组元素的位置。如果没有匹配元素则返回-1。我发现我用的很多的一个模式是连续比较,例如a === 'a' || a === 'b' || a === 'c',或者即使只有两个结果的比较。在这种情况下,你也可以使用.indexOf,像这样:['a', 'b', 'c'].indexOf(a) !== -1。
注意这对指向同一个引用的对象同样适用。第二个参数是开始查询的起始位置。
var a = { foo: 'bar' }
var b = [a, 2]
console.log(b.indexOf(1))
console.log(b.indexOf({ foo: 'bar' }))
console.log(b.indexOf(a))
console.log(b.indexOf(a, 1))
b.indexOf(2, 1)
如果你想从后向前搜索,.lastIndexOf能派上用场。
在面试中新手容易犯的错误是混淆.indexOf和in操作符,如下:
var a = [1, 2, 5]
// &- true, 但因为 2!
// &- false
问题的关键是in操作符检索对象的键而非值。当然,这在性能上比.indexOf快得多。
var a = [3, 7, 6]
1 in a === !!a[1]
// &- true
in操作符类似于将键值转换为布尔值。!!表达式通常被开发者用来双重取非一个值(转化为布尔值)。实际上相当于强制转换为布尔值,任何为真的值被转为true,任何为假的值被转换为false。
走进.reverse
这方法将数组中的元素翻转并替换原来的元素。
var a = [1, 1, 7, 8]
a.reverse()
// [8, 7, 1, 1]
和复制不同的是,数组本身被更改。在以后的文章中我将展开对这些概念的理解,去看看如何创建一个库,如Underscore或Lo-Dash。京 东 价:
[定价:¥]
PLUS会员专享价
支  持:
重  量:
搭配赠品:
服务支持:
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
JavaScript王者归来
商品介绍加载中...
扫一扫,精彩好书免费看
  网友评论  emu:这是我多年来最期盼的一本JS的书。月影式的思考问题的方式和角度,总是让人耳目一新。  我首先想说的是,作者不是个正常人来着。如果说像我这样的正常人看一个问题,可以构造出来一个数学模型,用一个函数来描述它fn(a,b,c,d...)={do&sth.},在确定了n个参数后,问题就可以解决;那么到了月影手里,这个问题就变成了n维的问题空间,在只确定了部分条件的时候,就可以把这个n维空间在一个n-m维空间上做一个投影,转化为另一个问题来看待(22.4节关于Currying的内容,是我看过的最精彩的关于函数式编程的讲解之一)。  一个脚本开发的问题,到了月影手里,也许实质上是个滤波器的问题(见本书第一章),也许和波粒二像性有关(看月影以前的博文),也许实质上是受到测不准原理的限制,也许和多维时空有密不可分的关系(都是某次和月影聊天时的话题),也许背后更有不可捉摸的“道”。月影看待问题的目光,总是这样穿透表象,深入实质,并升华了问题本身,最后不但可以解决这一个问题,还可以解决相关的一系列问题,而且在解决问题的过程中,我们可能已经解决了一系列的问题。这种月影式的风格,让我们每每击案叫绝。  这些年来,在JavaScript和DOM上面基于对象和函数式编程,网友们有过无数的尝试和探索。但是这样的探索之路是如此艰难,限于精力和能力,我们往往只能在得到零星小小的突破后便折返。我们也一直期待有达人可以穿透那些荆棘后把沿途的这些风景整理出来给后人分享,但是我们都知道这些风景只要看一眼已经是如此之难,要什么样的人,才能攀下这么多的高峰,并把它们一一系统的整理出来,呈现在大家面前?    aoao:是不是看到书的文字过于华丽,是不是认为这不是技术人员写的书?别急~华丽的语言并不与技术冲突,虽然很难想像得到有一本技术类的书读起来可以用舒服来形容,很不巧,刚好这本书就是。  是不是找不到有专门介绍IE或Firefox兼容的一章,是不是正想放弃这本书?别急~这不是一本只专注解决特定问题的书,而是一本让您看到JavaScript真相的书,当你了解了事实的真相时,问题自然迎刃而解。    dh20156:许久不曾买书,嗷嗷和月影的书是我至今为止最为期待的两本!  月影的这本书从开篇便用经验及趣味的脚本来吸引读者,加上引人入胜的描述方式,让人心痒不止,不睹不快!  再谈谈本书的设计,理论知识由浅到深的推进,实战则从最简单的应用直到当前最流行应用的深入分析,更值得一提的是,作者无时无刻不在引导着读者朝着一个真正的程序员的方向去看待问题、思考问题、解决问题!可以说,本书是一本“老少皆宜”的JavaScript参考手册!无论是新手还是已从事JavaScript工作多年的人,都可以从中获得巨大的帮助!  希望本书能够帮到更多的人,为Web开发带来更多新突破!    winter:这是一本求“道”的书。市面上关于JavaScript的书极多,且不乏精品,然而多执著于“术”。若讲JavaScript的语法,ECMA262标准的文档已经足够,若讲JavaScript与DOM应用,MSDN和W3C上的DOM参考也足够。  JavaScript是一门很有趣的语言,每取得一点更深入的理解,我便以为自己已经彻悟。从最初的函数使用、面向对象、原型继承、函数对象到后来作用域链、functional、预解析、表达式解析机制、动态语言特性,每在此道路上前进一步,我都曾以为自己到达了顶峰。然而,事实上是,简单的语法也能承载深刻的思想。巧妙的设计让JavaScript成为一门兼有元类(meta-class)、类(class-based)、原型(prototype-based)三种面向对象特性和functional特性的动态语言。回忆起来,对这样的语言,说我已到达顶峰,是十分可笑的。  这本书虽然已经详细到足可以代替参考手册来查阅,但是,它是一门讲思想的书。她将以优美的文字和同样优美的代码向你展示JavaScript的独特魅力。读过这本书,你不但能了解JavaScript,还会对整个编程的思想有一个新的认识,对于面向对象语言、函数式语言、动态语言有全新的理解。  从另一个角度说,思想也并非作者所追求的“道”的终极。透漏一下,除了项目经理/资深程序员外,作者还有很多身份:论坛版主、文学爱好者(写的小说挺不错、就是更新慢了点)、理论物理爱好者(是的,你将会看到他经常把程序跟理论物理联系起来)。读过这本书,你也许能理解作者所追求的“道”。  多说无益,赶紧弄一本回家看吧。    leisang:正在看样章,非常不错。前面的建议确实很有意义,一个JS初学者首先要学的不是如何炫耀各种网页特技,而是限制自己的欲望,保证只在必要的地方使用。    月影:那你觉得我写这本书是为什么?为名?为利?还是什么?  这本书的市场定位和读者群又是什么?  我和出版社的关系是什么?出版社为什么让我写这本书?他们对市场有过怎样的研究?我作为签约作者,又如何去对待这本书,如何在这之间取舍?如何同时对出版社和读者负责?  很多事情不是由我能够决定的,而你呢,要理解他人的付出和他人的难处……  你知道一本600页的书一年时间完成需要多少付出吗?  你知道被人期待而恨自己能力不能再高一点的那种感觉吗?  你知道自己累死累活写出来的书,本以为能够虚心接受心平气和的指点和批评的时候突然受到劈头盖脸的一通乱棒时的那种感觉吗?  不是我接受不了尖锐的批评,而是我希望评论时能够稍微体谅一下我这个作者,平和地告诉我哪里不好,哪里要修改……而不是一上来就说我这本书是没有价值的……  你的技术和知识面我还是比较认可的,你的批评我也虚心接受,但你前面的一些过于尖锐的言辞我接受不了,抱歉了~  (策划编辑点评:上面这段话是作者对一个在论坛上以极不友好的言词和视角攻击他的书的网友的回复,之所以把这段话放在这里,是因为从这段话中可以感受到作者对自己作品倾注的感情。令我感动的是这句话——“你知道被人期待而恨自己能力不能再高一点的那种感觉吗?”)    redcarpet:作者乃我的围棋师傅,我相信他的文章就如他教的围棋一样,让JS的学习者能进入神奇的JS之门。  希望JS迷们,能接近那传说中的“神之一技”的境界。  个人觉得最有看点的部分:第五部分&第二十二章&看点:闭包与函数式编程。  还有一点小小建议:  新学JS的朋友,可以试着按如下顺序看:第一部分&第三章&开发环境和调试方法,第二部分&全部,第三、四部分,第五部分&最后看。  刚接触任何一门语言,碰到的问题就是编辑环境了,好多初学者自己摸索的话,会走不少的弯路。JS也不例外,先了解开发环境和调试方法,磨刀不误砍柴功。  刚学JS,不要立刻陷入具体使用环境中的问题,先把语言的核心、思想学好了,再看客户端、服务端上的JS。第二部分学透了,就会为后续的章节打下了比较好的基础。    voocoo:强烈支持一下,久闻月影大侠的名字,出书了我一定会买一本,光看目录就够吸引我了!    greatghoul:这位兄台可就不对了,入门书是很多,但真正优秀的不是很多,现在比的就是谁的书能让读者更容易的入门,讲得那么专业,小孩子吓都吓死了,还入门个pp呀。  月版在论坛里名声也算不小,解决的问题也算不少,而且还有大公无私的精神(上面有所提及),大家都喜欢他(她)的生动的语言,读他(她)的书就好像在论坛里面和他(她)交流一样,在这样具有亲和力的环境中入门,是非常享受的。  这位兄台或许书读的很多,但对入门书籍方面只是想当然,不是书写得专业就行,像《Thinking&in&Java》就写得很有亲和力,但依然受很多所谓专业人士的抨击,然而读者喜欢。月版要致力于写类似于Thinking&in&JavaScript的东西呀。    秦皇也爱JS:说实话,这本书非常好看,月影的写作水平和文字功底是非常之高啊。像《JavaScript权威指南》,有时候看着看着就看不下去了,但这本书的样章却让我看得兴致盎然,不忍释卷。里面竟然还穿插了我喜欢的《明朝那些事儿》的句子,呵呵,真是奇峰迭起。比起呆板严肃的译版,我还是更喜欢这本。顶!    编程浪子:一本有思想的书,其价值已超出内容本身,以前那些JS的书看着就乏味,教条式太严重。  还没看到书,不敢把作者评得那么好,不过我相信月影的实力,样章就写得不错,可谓“得道中人”呀。    xpnew:月影老大出书了,我们一定要支持!确实很感动啊。    myhome:不适合你读,但很适合我读!没人要你读,综合你的一些言论和表现,得出的结论是你没资格读这书,因为你根本就不懂作者写的是什么!  (策划编辑点评:在论坛上以极不友好的言词和视角攻击作者所写的这本书的那个网友的言词,激起了其他很多网友的反感,这是其中一个网友对那位攻击者的回复。)    果蝇:其实我更希望月影把书写成小说或散文的形式,有什么不可以的呢!我们需要的是生动有趣的语言和奇思妙想,也许不是很技术,但可以给读者以遐想、启发,可以开阔我们的思路,我想如果书能达到这个目的,那就是一本难得的好书了。  我想这也是无忧能如此吸引人的原因。  看过月版的一些帖子,对月版的书有更多的期待。  易中天曾把自己的文章给出版社看,主编退稿说你这个是散文,不是学术著作。  事实证明学术这些东西不只是在高高的象牙塔尖上,也证明一些人脑筋确实死得很,不必太在意。  月影应该感到荣幸有这么多的关注,不管是好是坏,都是支持。    solidluck:你就放肆的写吧,让我们也放肆的看。    真不聪明:个人觉得好书在于对基础讲解的深刻,而不是用最新的技术来引诱你。    xuchaofeng:在哪儿有买的,期待中……    monfs:快出呀,等不急了,这是一个历史时刻!    fuhao:这书要出了可得通知一声,看了样章就有了看下去的欲望了!    LeoZ:我也每天上来看一下是否有出版,可是每次都没消息,我也继续等。    samon127:什么时候出版啊,等了好久了:)    ansonvili:什么时候出啊,等不急了。    freeren:看了样章,很贴切,很易理解,期待书的发行!    ravioli:每天以泪洗面的等啊等。    fchnipj:等的好辛苦,月版主能说说具体的时间吗?好想看呀。  (策划编辑点评:本来我希望这本书在2008年的春节后就能出版,而实际上却由于种种原因一直拖到了6月份这本书才面世。说声抱歉,读者们,让你们久等了。)
京东商城向您保证所售商品均为正品行货,京东自营商品开具机打发票或电子发票。
凭质保证书及京东商城发票,可享受全国联保服务(奢侈品、钟表除外;奢侈品、钟表由京东联系保修,享受法定三包售后服务),与您亲临商场选购的商品享受相同的质量保证。京东商城还为您提供具有竞争力的商品价格和,请您放心购买!
注:因厂家会在没有任何提前通知的情况下更改产品包装、产地或者一些附件,本司不能确保客户收到的货物与商城图片、产地、附件说明完全一致。只能确保为原厂正货!并且保证与当时市场上同样主流新品一致。若本商城没有及时更新,请大家谅解!
权利声明:京东上的所有商品信息、客户评价、商品咨询、网友讨论等内容,是京东重要的经营资源,未经许可,禁止非法转载使用。
注:本站商品信息均来自于合作方,其真实性、准确性和合法性由信息拥有者(合作方)负责。本站不提供任何保证,并不承担任何法律责任。
印刷版次不同,印刷时间和版次以实物为准。
价格说明:
京东价:京东价为商品的销售价,是您最终决定是否购买商品的依据。
划线价:商品展示的划横线价格为参考价,该价格可能是品牌专柜标价、商品吊牌价或由品牌供应商提供的正品零售价(如厂商指导价、建议零售价等)或该商品在京东平台上曾经展示过的销售价;由于地区、时间的差异性和市场行情波动,品牌专柜标价、商品吊牌价等可能会与您购物时展示的不一致,该价格仅供您参考。
折扣:如无特殊说明,折扣指销售商在原价、或划线价(如品牌专柜标价、商品吊牌价、厂商指导价、厂商建议零售价)等某一价格基础上计算出的优惠比例或优惠金额;如有疑问,您可在购买前联系销售商进行咨询。
异常问题:商品促销信息以商品详情页“促销”栏中的信息为准;商品的具体售价以订单结算页价格为准;如您发现活动商品售价或促销信息有异常,建议购买前先联系销售商咨询。
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
浏览了该商品的用户还浏览了
加载中,请稍候...
联系供应商
七日畅销榜
新书热卖榜
iframe(src='///ns.html?id=GTM-T947SH', height='0', width='0', style='display: visibility:')}

我要回帖

更多关于 javascript 对象数组 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信