JS总结篇03--数据类型(下篇)

一,迭代器类型对象

迭代器类型对象是一种广义的数组,是指对象实现了obj[Symbol.iterator]方法能够通过for…of来遍历的对象。数组和字符串都是可迭代对象。

迭代对象运行原理:
1.当for…of开始执行时,调用obj[Symbol.iterator]()
2.该方法必须返回一个带有next()方法的对象
3.当for…of获取下一个值的时候,调用next()方法
4.next()方法返回对象格式为{done:Boolean,value:any}当done = true时,代表已经遍历完毕。

let range = {
  from: 1,
  to: 5
};

// 1. call to for..of initially calls this
range[Symbol.iterator] = function() {

  // 2. ...it returns the iterator:
  return {
    current: this.from,
    last: this.to,

    // 3. next() is called on each iteration by the for..of loop
    next() {
      // 4. it should return the value as an object {done:.., value :...}
      if (this.current <= this.last) {
        return { done: false, value: this.current++ };
      } else {
        return { done: true };
      }
    }
  };
};

// now it works!
for (let num of range) {
  alert(num); // 1, then 2, 3, 4, 5
}

类数组对象:
具备坐标和length属性的对象。

Array.from():
将迭代器对象或类数组对象转换为数组的方法。

二,Map,Set,WeakMap,WeakSet

Map: map和object一样,也是键值对的集合,不同点在于Map允许使用任何类型的key,而object的key只能为string或Symbol。

方法:
new Map([entries]) 创建Map
map.set(key, value) 存储
map.get(key) 读
map.has(key) 返回boolean
map.delete(key) 删除
map.clear() 清空
map.size

map中比较key值是否相等采用类似===比较,不同的是NaN此时等于NaN

Map遍历
map.keys() 返回keys的iterable
map.values() 返回values的iterable
map.entries() 返回[key, value]的iterable
map.forEach((value, key, map)=>{})
遍历顺序与插入顺序相同

Set
set是一系列值得集合,每个值仅允许出现一次。
方法:
new Set([iteratable]) 创建set
set.add(value) 返回新的set
set.delete(value) 返回boolean
set.has(value) 返回boolean
set.clear()
set.size();

遍历:
for…of 或 set.forEach()
set.keys() 返回值的iterable
set.values() 返回值的iterable
set.entries() 返回值[value,value]的iterable

WeakMap,WeakSet
当Map以对象作为key值或Set以对象作为元素的时候,如果该对象处于不可访问状态,此时垃圾回收器不会回收该对象,因此会造成内存泄漏。WeakMap和WeakSet因此诞生。

WeakMap只支持以对象作为key,WeakSet只支持以对象作为值。
weakMap支持方法:
weakMap.get(key)
weakMap.set(key,value)
weakMap.delete(key,value)
weakMap.has(key)

weakSet支持的方法:
weakSet.add(value)
weakSet.has(value)
weakSet.delete(value)

支持keys(),values(),entries()的类型:
Map/Set/Array
普通对象支持 Object.keys()/Object.values()/Object.entries()
Object.*返回的是数组,而Map.keys()等返回的是iterable,前者不写在原型中的原因是为了灵活性,使用户自定义的类型可以拥有自己的keys()/values()/entries()方法,也可以调用到Object.keys()/values()/entries()

获取symbolic类型的参数时,可用Object.getOwnPropertySymbols(obj)
或Reflect.ownKeys(obj)

三.解构赋值

解构赋值是一种特殊的语法,允许我们从数组或对象中提取值并赋给变量。

数组解构

右侧可以为任何可迭代对象。
如:
let [a, b, c] = “abc”; // [“a”, “b”, “c”]
let [one, two, three] = new Set([1, 2, 3]);

//1.
// we have an array with the name and surname
let arr = ["Ilya", "Kantor"]

// destructuring assignment
let [firstName, surname] = arr;

alert(firstName); // Ilya
alert(surname);  // Kantor

//2.
let [firstName, surname] = "Ilya Kantor".split(' ');

//3.
// first and second elements are not needed
let [, , title] = ["Julius", "Caesar", "Consul", "of the Roman Republic"];

alert( title ); // Consul

//4.
let user = {
  name: "John",
  age: 30
};

// loop over keys-and-values
for (let [key, value] of Object.entries(user)) {
  alert(`${key}:${value}`); // name:John, then age:30
}

rest操作符"…"
如果我们只想获取数组前面几个参数,而将后面的其他参数聚集到一个数组时,可以用rest操作符。

let [name1, name2, ...rest] = ["Julius", "Caesar", "Consul", "of the Roman Republic"];

alert(name1); // Julius
alert(name2); // Caesar

alert(rest[0]); // Consul
alert(rest[1]); // of the Roman Republic
alert(rest.length); // 2

默认值
默认值可以为表达式,仅当值没有提供时才会执行。

// runs only prompt for surname
let [name = prompt('name?'), surname = prompt('surname?')] = ["Julius"];

alert(name);    // Julius (from array)
alert(surname); // whatever prompt gets

对象解构

1.
let options = {
  title: "Menu",
  width: 100,
  height: 200
};

let {title, width, height} = options;

alert(title);  // Menu
alert(width);  // 100
alert(height); // 200

2.
let options = {
  title: "Menu"
};

let {width = 100, height = 200, title} = options;

alert(title);  // Menu
alert(width);  // 100
alert(height); // 200

rest操作符,只有小部分浏览器支持;

注意点:

原因是遇见{}时,程序会将该代码看成独立代码块,因此报错。

// error in this line
{title, width, height} = {title: "Menu", width: 200, height: 100};

// okay now
({title, width, height} = {title: "Menu", width: 200, height: 100});

嵌套赋值

let options = {
  size: {
    width: 100,
    height: 200
  },
  items: ["Cake", "Donut"],
  extra: true    // something extra that we will not destruct
};

// destructuring assignment on multiple lines for clarity
let {
  size: { // put size here
    width,
    height
  },
  items: [item1, item2], // assign items here
  title = "Menu" // not present in the object (default value is used)
} = options;

alert(title);  // Menu
alert(width);  // 100
alert(height); // 200
alert(item1);  // Cake
alert(item2);  // Donut

为了函数传参方便,通常采用以下形式:

// simplified parameters a bit for clarity
function showMenu({ title = "Menu", width = 100, height = 200 } = {}) {
  alert( `${title} ${width} ${height}` );
}

showMenu(); // Menu 100 200

四.Date

1.创建
new Date();
new Date(timestamp);
new Date(“YYYY-MM-DDTHH:mm:ss.sssZ”);
new Date(year,month,day,hours,minus,seconds,ms);

2.获取时间
getFullYear() ; 4位数字的年份
getMonth(); 0~11
getDate(); 1~31
getHours(); 0~23
getMinutes(); 0~59
getSeconds(); 0~59
getMillseconds(); 0~999
getDay; 0~6 一周中的第几天 周日为6
以上方法均有对应的UTC方法
getTime();获取UTC距离1970年一月一日的毫秒数
getTimezoneOffset();获取时区

设置时间:
setFullYear(year [,month,date])
setMonth(month [,date])
setDate(date)
setHours(hour [,min,sec,ms])
setMinutes(min [,sec,ms])
setSeconds(sec [,ms])
setMilliseconds(ms)
以上方法均有对应的UTC方法如:setUTCHours()
setTime(milliseconds)

自动纠正机制:
当设置了超出范围的值的时候,系统会根据偏移的多少来调整日期,即进行日期计算
如:

let date = new Date(2013, 0, 32); // 32 Jan 2013 ?!?
alert(date); // ...is 1st Feb 2013!

let date = new Date();
date.setSeconds(date.getSeconds() + 70);

alert( date ); // shows the correct date


let date = new Date(2016, 0, 2); // 2 Jan 2016

date.setDate(1); // set day 1 of month
alert( date );

date.setDate(0); // min day is 1, so the last day of the previous month is assumed
alert( date ); // 31 Dec 2015

date转number类型:
相当于date.getTime()
date类型可以相减,返回相差的毫秒数(ms)

Date.now(): 获取当前时间戳
此方法无需创建对象,比date.getTime()速度快。

Date.parse(‘YYYY-MM-DDTHH:mm:ss.sssZ’)
Date.parse(‘YYYY-MM’)
Date.parse(‘YYYY’)
Date.parse()返回timestamp

五.JSON

JSON.stringify(obj)
注意点:
1.json编码化的字符串同原对象的差别:
字符串都是双引号,而不是单引号或反引号
字符串属性也需要用双引号包裹。

let student = {
  name: 'John',
  age: 30,
  isAdmin: false,
  courses: ['html', 'css', 'js'],
  wife: null
};

let json = JSON.stringify(student);

alert(typeof json); // we've got a string!

alert(json);
/* JSON-encoded object:
{
  "name": "John",
  "age": 30,
  "isAdmin": false,
  "courses": ["html", "css", "js"],
  "wife": null
}
*/

2.有以下几种类型不可进行转换,将会被无视掉
函数
Symbolic
值为undefined的参数

let user = {
  sayHi() { // ignored
    alert("Hello");
  },
  [Symbol("id")]: 123, // ignored
  something: undefined // ignored
};

alert( JSON.stringify(user) ); // {} (empty object)
  1. 无法转换有循环引用的对象。

语法:
let json = JSON.stringify(value[, replacer, space])
value:待转换对象
replacer: 需要转换的属性的数组,或者映射函数function(key,value)
space: 缩进位数

let room = {
  number: 23
};

let meetup = {
  title: "Conference",
  participants: [{name: "John"}, {name: "Alice"}],
  place: room // meetup references room
};

room.occupiedBy = meetup; // room references meetup

alert( JSON.stringify(meetup, ['title', 'participants', 'place', 'name', 'number']) );
/*
{
  "title":"Conference",
  "participants":[{"name":"John"},{"name":"Alice"}],
  "place":{"number":23}
}


或

alert( JSON.stringify(meetup, function replacer(key, value) {
  alert(`${key}: ${value}`); // to see what replacer gets
  return (key == 'occupiedBy') ? undefined : value;
}));
/* key:value pairs that come to replacer:
:             [object Object]
title:        Conference
participants: [object Object],[object Object]
0:            [object Object]
name:         John
1:            [object Object]
name:         Alice
place:        [object Object]
number:       23
*/

对象可以实现自己的toJSON()方法,当JSON.stringify()转换该对象时,就会采用toJSON()方法进行转换。

let room = {
  number: 23,
  toJSON() {
    return this.number;
  }
};

let meetup = {
  title: "Conference",
  room
};

alert( JSON.stringify(room) ); // 23

alert( JSON.stringify(meetup) );
/*
  {
    "title":"Conference",
    "room": 23
  }
*/

JSON.parse

语法:
JSON.parse(str [,reviver])

let str = '{"title":"Conference","date":"2017-11-30T12:00:00.000Z"}';

let meetup = JSON.parse(str, function(key, value) {
  if (key == 'date') return new Date(value);
  return value;
});

alert( meetup.date.getDate() ); // now works!

JSON字符串必须严格规范,如:

let json = `{
  name: "John",                     // mistake: property name without quotes
  "surname": 'Smith',               // mistake: single quotes in value (must be double)
  'isAdmin': false                  // mistake: single quotes in key (must be double)
  "birthday": new Date(2000, 2, 3), // mistake: no "new" is allowed, only bare values
  "friends": [0,1,2,3]              // here all fine
}`;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: cocos2d-x js是一个开源的游戏开发引擎,用于开发跨平台的2D游戏,它使用JavaScript作为脚本语言。以下是对cocos2d-x js的回答。 cocos2d-x js是cocos2d-x引擎的JavaScript版本,它继承了cocos2d-x引擎强大的功能和性能,同时提供了使用JavaScript编写游戏的便利性。 cocos2d-x js通过使用JavaScript脚本语言进行游戏开发,使得开发者可以更加方便地编写游戏逻辑和动作表现。JavaScript是一种简单易用的脚本语言,对于不熟悉复杂编程语言的开发者来说,使用JavaScript进行游戏开发会更加容易上手。 cocos2d-x js提供了丰富的游戏功能和API,包括精灵动画、物理引擎、碰撞检测、场景管理等,这些功能可以帮助开发者快速构建2D游戏。同时,cocos2d-x js还提供了跨平台的支持,可以将游戏轻松移植到不同的平台上,如iOS、Android、Windows等。 除了基本的功能和API,cocos2d-x js还支持插件和扩展,开发者可以根据自己的需求进行扩展和定制,以满足游戏的特殊需求。 总结来说,cocos2d-x js是一个强大而灵活的游戏开发引擎,它提供了使用JavaScript进行游戏开发的便利性,同时具备跨平台的支持和丰富的功能和API。无论是初学者还是有经验的开发者,都可以通过cocos2d-x js来快速构建出高质量的2D游戏。 ### 回答2: Cocos2d-x是一款强大的跨平台游戏开发引擎,具有许多独特而且强大的功能。cocos2d-x js是Cocos2d-x引擎的JavaScript版本,它可以让开发者使用JavaScript编写游戏逻辑和界面。 使用Cocos2d-x js,开发者可以轻松地创建2D游戏,并在多个平台上运行,如iOS、Android、Windows和Web。这意味着开发者只需编写一次代码,就可以发布到多个平台,大大提高了开发效率。 cocos2d-x js提供了丰富的API和功能,使得开发复杂的游戏变得轻松。它包括图形渲染、动画系统、物理引擎、碰撞检测、音频管理等功能,开发者可以利用这些功能创建出丰富多样的游戏体验。 此外,cocos2d-x js还支持现代开发工具和技术,如可视化编辑器Cocos Creator,可实时调试和热更新等。开发者可以使用Cocos Creator创建游戏场景、编辑动画、创建粒子效果等。同时,Cocos2d-x js还集成了调试工具,方便开发者进行错误排查和优化。 总之,Cocos2d-x js是一个非常强大且灵活的游戏开发引擎。它提供了广泛的功能和工具,使得开发者能够快速创建高质量的2D游戏,并在多个平台上发布。无论是初学者还是有经验的开发者,都可以通过Cocos2d-x js轻松实现独特而丰富的游戏体验。 ### 回答3: Cocos2d-x js是一种使用Javascript编写的跨平台游戏开发框架。它是基于Cocos2d-x引擎的扩展,可以在多个平台上运行,包括iOS、Android、Windows和Mac等。 Cocos2d-x js提供了丰富的游戏开发工具和功能,可以帮助开发人员轻松创建高质量的游戏应用。它具有优秀的性能和灵活性,并且能够快速部署到各种平台上。 使用Cocos2d-x js,开发人员可以使用熟悉的Javascript语言进行游戏开发,而无需学习其他编程语言。它提供了一系列API和组件,例如精灵、动作、节点和场景等,以简化游戏的创建和管理过程。 此外,Cocos2d-x js还提供了多种功能,如物理引擎、碰撞检测、音效播放和动画效果等,可以帮助开发人员实现各种游戏特效和交互效果。 Cocos2d-x js还支持一些常用的开发模式和工具,如游戏UI编辑器、游戏调试器和性能分析器等,方便开发人员进行游戏开发和调试。 总之,Cocos2d-x js是一款功能强大、易于使用并且跨平台的游戏开发框架。无论是新手还是经验丰富的开发人员,都可以借助它来创建出令人印象深刻的游戏应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值