对象与对象方法

176 阅读18分钟

对象

*** 对象:对象是拥有属性和方法的数据。***

*** 属性是与对象相关的值。方法是能够在对象上执行的动作。***

举例:汽车就是现实生活中的对象。

汽车的属性:

car.name=Fiat

car.model=500

car.weight=850kg

car.color=white 

汽车的方法:

car.start()

car.drive()

car.brake()

汽车的属性包括名称、型号、重量、颜色等。

所有汽车都有这些属性,但是每款车的属性都不尽相同。

汽车的方法可以是启动、驾驶、刹车等。

所有汽车都拥有这些方法,但是它们被执行的时间都不尽相同。

JavaScript 中的所有事物都是对象:字符串、数值、数组、函数... 此外,JavaScript 允许自定义对象。

*** js内置对象:***

  • Array对象
  • Boolean对象
  • Date对象
  • Math对象
  • Number对象
  • String对象
  • RegExp对象
  • Error对象

*** 浏览器对象:***

  • Window对象
  • Navigator对象
  • Screen对象
  • History对象
  • Location对象
  • 存储对象

js内置对象

*** Array对象***

在另一篇笔记里有写

数组与数组方法

*** Boolean对象***

*** 1.定义与创建 ***

Boolean 对象用于转换一个不是 Boolean 类型的值转换为 Boolean 类型值 (true 或者false).

var myBoolean=new Boolean();

布尔对象若为以下值,则值为false,否则都是true

  • 0
  • -0
  • null
  • ""
  • false
  • undefined
  • NaN

*** 2.对象属性***

constructor 返回对创建此对象的 Boolean 函数的引用

var myvar = new Boolean(1);
myvar.constructor;
结果输出:
function Boolean() { [native code] }

prototype 向对象添加属性和方法。

*** 3.对象方法***

toString() 把布尔值转换为字符串,并返回结果.

valueOf() 返回 Boolean 对象的原始值。

*** Boolean对象***

*** 1.定义与创建 ***

Date 对象用于处理日期与时间。

以下可以创建 Date 对象:

var d = new Date();// 当前日期和时间//Mon Nov 05 2018 09:07:40 GMT+0800 (中国标准时间)
var milliseconds=135157220564
var d1 = new Date(milliseconds);//距离1970年1月1日的毫秒数//Sun Apr 14 1974 15:40:20 GMT+0800 (中国标准时间) 
//   日期的字符串格式,常用格式2010-10-5 12:00:00(在google浏览器中有效)、
//   10/5/2012 12:00:00、2010/10/5 12:00:00、Oct 5 2012 12:00:00
var dateString='2010/10/5 12:00:00'
var d2 = new Date(dateString);//Tue Oct 05 2010 12:00:00 GMT+0800 (中国标准时间)
var year = 2010, month = 10, day = 2;
var hours = 10, minutes = 30, seconds = 45, microseconds = 500
var d3 = new Date(year, month)//Mon Nov 01 2010 00:00:00 GMT+0800 (中国标准时间)
var d4 = new Date(year, month, day)//Tue Nov 02 2010 00:00:00 GMT+0800 (中国标准时间) 
var d5 = new Date(year, month, day, hours)//Tue Nov 02 2010 10:00:00 GMT+0800 (中国标准时间)
var d6 = new Date(year, month, day, hours, minutes)//Tue Nov 02 2010 10:30:00 GMT+0800 (中国标准时间)
var d7 = new Date(year, month, day, hours, minutes, seconds)//Tue Nov 02 2010 10:30:45 GMT+0800 (中国标准时间)
var d8 = new Date(year, month, day, hours, minutes, seconds, microseconds);//Tue Nov 02 2010 10:30:45 GMT+0800 (中国标准时间)

*** 2.对象属性***

constructor 返回对创建此对象的 Date 函数的引用

prototype 向对象添加属性和方法。

*** 3.对象方法***

方法 描述 getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31)。

getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6)。

getFullYear() 从 Date 对象以四位数字返回年份。

getHours() 返回 Date 对象的小时 (0 ~ 23)。

getMilliseconds() 返回 Date 对象的毫秒(0 ~ 999)。

getMinutes() 返回 Date 对象的分钟 (0 ~ 59)。

getMonth() 从 Date 对象返回月份 (0 ~ 11)。

getSeconds() 返回 Date 对象的秒数 (0 ~ 59)。

getTime() 返回 1970 年 1 月 1 日至今的毫秒数。

getTimezoneOffset() 返回本地时间与格林威治标准时间 (GMT) 的分钟差。

getUTCDate() 根据世界时从 Date 对象返回月中的一天 (1 ~ 31)。

getUTCDay() 根据世界时从 Date 对象返回周中的一天 (0 ~ 6)。

getUTCFullYear() 根据世界时从 Date 对象返回四位数的年份。

getUTCHours() 根据世界时返回 Date 对象的小时 (0 ~ 23)。

getUTCMilliseconds() 根据世界时返回 Date 对象的毫秒(0 ~ 999)。

getUTCMinutes() 根据世界时返回 Date 对象的分钟 (0 ~ 59)。

getUTCMonth() 根据世界时从 Date 对象返回月份 (0 ~ 11)。

getUTCSeconds() 根据世界时返回 Date 对象的秒钟 (0 ~ 59)。

parse() 返回1970年1月1日午夜到指定日期(字符串)的毫秒数。

setDate() 设置 Date 对象中月的某一天 (1 ~ 31)。

setFullYear() 设置 Date 对象中的年份(四位数字)。

setHours() 设置 Date 对象中的小时 (0 ~ 23)。

setMilliseconds() 设置 Date 对象中的毫秒 (0 ~ 999)。

setMinutes() 设置 Date 对象中的分钟 (0 ~ 59)。

setMonth() 设置 Date 对象中月份 (0 ~ 11)。

setSeconds() 设置 Date 对象中的秒钟 (0 ~ 59)。

setTime() setTime() 方法以毫秒设置 Date 对象。

setUTCDate() 根据世界时设置 Date 对象中月份的一天 (1 ~ 31)。

setUTCFullYear() 根据世界时设置 Date 对象中的年份(四位数字)。

setUTCHours() 根据世界时设置 Date 对象中的小时 (0 ~ 23)。

setUTCMilliseconds() 根据世界时设置 Date 对象中的毫秒 (0 ~ 999)。

setUTCMinutes() 根据世界时设置 Date 对象中的分钟 (0 ~ 59)。

setUTCMonth() 根据世界时设置 Date 对象中的月份 (0 ~ 11)。

setUTCSeconds() setUTCSeconds() 方法用于根据世界时 (UTC) 设置指定时间的秒字段。

toDateString() 把 Date 对象的日期部分转换为字符串。

toISOString() 使用 ISO 标准返回字符串的日期格式。

toJSON() 以 JSON 数据格式返回日期字符串。

toLocaleDateString() 根据本地时间格式,把 Date 对象的日期部分转换为字符串。

toLocaleTimeString() 根据本地时间格式,把 Date 对象的时间部分转换为字符串。

toLocaleString() 据本地时间格式,把 Date 对象转换为字符串。

toString() 把 Date 对象转换为字符串。

toTimeString() 把 Date 对象的时间部分转换为字符串。

toUTCString() 根据世界时,把 Date 对象转换为字符串。

UTC() 根据世界时返回 1970 年 1 月 1 日 到指定日期的毫秒数。

valueOf() 返回 Date 对象的原始值。

*** Math对象***

*** 1.定义与创建 ***

Math 对象用于执行数学任务。

Math 对象并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math()。

var x = Math.PI; // 返回PI

var y = Math.sqrt(16); // 返回16的平方根

*** 2.对象属性***

console.log(Math.E)//2.718281828459045 E 返回算术常量 e,即自然对数的底数(约等于2.718)。

LN2 返回 2 的自然对数(约等于0.693)。

LN10 返回 10 的自然对数(约等于2.302)。

LOG2E 返回以 2 为底的 e 的对数(约等于 1.4426950408889634)。

LOG10E 返回以 10 为底的 e 的对数(约等于0.434)。

PI 返回圆周率(约等于3.14159)。

SQRT1_2 返回 2 的平方根的倒数(约等于 0.707)。

SQRT2 返回 2 的平方根(约等于 1.414)。

*** 3.对象方法***

方法 描述

abs(x) 返回 x 的绝对值。

acos(x) 返回 x 的反余弦值。

asin(x) 返回 x 的反正弦值。

atan(x) 以介于 -PI/2 与 PI/2 弧度之间的数值来返回 x 的反正切值。

atan2(y,x) 返回从 x 轴到点 (x,y) 的角度(介于 -PI/2 与 PI/2 弧度之间)。

ceil(x) 对数进行上舍入。

cos(x) 返回数的余弦。

exp(x) 返回 Ex 的指数。

floor(x) 对 x 进行下舍入。

log(x) 返回数的自然对数(底为e)。

max(x,y,z,...,n) 返回 x,y,z,...,n 中的最高值。

min(x,y,z,...,n) 返回 x,y,z,...,n中的最低值。

pow(x,y) 返回 x 的 y 次幂。

random() 返回 0 ~ 1 之间的随机数。

round(x) 四舍五入。

sin(x) 返回数的正弦。

sqrt(x) 返回数的平方根。

tan(x) 返回角的正切。

*** Number()***

*** 1.定义与创建 ***

Number 对象是原始数值的包装对象。

Number 创建方式 new Number()。

var num = new Number(value);

注意: 如果一个参数值不能转换为一个数字将返回 NaN (非数字值)。

*** 2.对象属性***

constructor 返回对创建此对象的 Number 函数的引用。

MAX_VALUE 可表示的最大的数。

MIN_VALUE 可表示的最小的数。

NEGATIVE_INFINITY 负无穷大,溢出时返回该值。

NaN 非数字值。

POSITIVE_INFINITY 正无穷大,溢出时返回该值。

prototype 允许您有能力向对象添加属性和方法。

*** 3.对象方法***

方法 描述

toExponential(x) 把对象的值转换为指数计数法。

toFixed(x) 把数字转换为字符串,结果的小数点后有指定位数的数字。

toPrecision(x) 把数字格式化为指定的长度。

toString() 把数字转换为字符串,使用指定的基数。

valueOf() 返回一个 Number 对象的基本数字值。

*** String()***

*** 1.定义与创建 ***

String 对象用于处理文本(字符串)。

String 对象创建方法: new String().

var txt = new String("string");
或者更简单方式:
var txt = "string";

*** 2.对象属性***

constructor 对创建该对象的函数的引用

length 字符串的长度

prototype 允许您向对象添加属性和方法

*** 3.对象方法***

方法 描述

charAt() 返回在指定位置的字符。

charCodeAt() 返回在指定的位置的字符的 Unicode 编码。

concat() 连接两个或更多字符串,并返回新的字符串。

fromCharCode() 将 Unicode 编码转为字符。

indexOf() 返回某个指定的字符串值在字符串中首次出现的位置。

lastIndexOf() 从后向前搜索字符串,并从起始位置(0)开始计算返回字符串最后出现的位置。

match() 查找找到一个或多个正则表达式的匹配。

replace() 在字符串中查找匹配的子串, 并替换与正则表达式匹配的子串。

search() 查找与正则表达式相匹配的值。

slice() 提取字符串的片断,并在新的字符串中返回被提取的部分。

split() 把字符串分割为字符串数组。

substr() 从起始索引号提取字符串中指定数目的字符。

substring() 提取字符串中两个指定的索引号之间的字符。

toLowerCase() 把字符串转换为小写。

toUpperCase() 把字符串转换为大写。

trim() 去除字符串两边的空白

valueOf() 返回某个字符串对象的原始值。

*** Error()***

*** 1.定义与创建 ***

Error 对象在错误发生时提供了错误的提示信息。

try {
    adddlert("Welcome");
}
catch(err) {
    document.getElementById("demo").innerHTML = 
    err.name + "<br>" + err.message;
}

*** 2.对象属性***

name 设置或返回一个错误名

message 设置或返回一个错误信息(字符串)

*** 全局属性/全局函数***

*** 属性***

Infinity 代表正的无穷大的数值。

NaN 指示某个值是不是数字值。

undefined 指示未定义的值。

*** 函数***

函数 描述 decodeURI() 解码某个编码的 URI。

decodeURIComponent() 解码一个编码的 URI 组件。

encodeURI() 把字符串编码为 URI。

encodeURIComponent() 把字符串编码为 URI 组件。

escape() 对字符串进行编码。

eval() 计算 JavaScript 字符串,并把它作为脚本代码来执行。

isFinite() 检查某个值是否为有穷大的数。

isNaN() 检查某个值是否是数字。

Number() 把对象的值转换为数字。

parseFloat() 解析一个字符串并返回一个浮点数。

parseInt() 解析一个字符串并返回一个整数。

String() 把对象的值转换为字符串。

unescape() 对由 escape() 编码的字符串进行解码。

Window对象

*** 1.定义与创建 ***

Window 对象表示浏览器中打开的窗口。

如果文档包含框架(<frame> 或 <iframe> 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个额外的 window 对象。

*** 2.对象属性***

closed 返回窗口是否已被关闭。 defaultStatus 设置或返回窗口状态栏中的默认文本。 document 对 Document 对象的只读引用。(请参阅对象) frames 返回窗口中所有命名的框架。该集合是 Window 对象的数组,每个 Window 对象在窗口中含有一个框架。 history 对 History 对象的只读引用。请参数 History 对象。 innerHeight 返回窗口的文档显示区的高度。 innerWidth 返回窗口的文档显示区的宽度。 localStorage 在浏览器中存储 key/value 对。没有过期时间。 length 设置或返回窗口中的框架数量。 location 用于窗口或框架的 Location 对象。请参阅 Location 对象。 name 设置或返回窗口的名称。 navigator 对 Navigator 对象的只读引用。请参数 Navigator 对象。 opener 返回对创建此窗口的窗口的引用。 outerHeight 返回窗口的外部高度,包含工具条与滚动条。 outerWidth 返回窗口的外部宽度,包含工具条与滚动条。 pageXOffset 设置或返回当前页面相对于窗口显示区左上角的 X 位置。 pageYOffset 设置或返回当前页面相对于窗口显示区左上角的 Y 位置。 parent 返回父窗口。 screen 对 Screen 对象的只读引用。请参数 Screen 对象。 screenLeft 返回相对于屏幕窗口的x坐标 screenTop 返回相对于屏幕窗口的y坐标 screenX 返回相对于屏幕窗口的x坐标 sessionStorage 在浏览器中存储 key/value 对。 在关闭窗口或标签页之后将会删除这些数据。 screenY 返回相对于屏幕窗口的y坐标 self 返回对当前窗口的引用。等价于 Window 属性。 status 设置窗口状态栏的文本。 top 返回最顶层的父窗口。

*** 3.对象方法***

alert() 显示带有一段消息和一个确认按钮的警告框。 atob() 解码一个 base-64 编码的字符串。 btoa() 创建一个 base-64 编码的字符串。 blur() 把键盘焦点从顶层窗口移开。 clearInterval() 取消由 setInterval() 设置的 timeout。 clearTimeout() 取消由 setTimeout() 方法设置的 timeout。 close() 关闭浏览器窗口。 confirm() 显示带有一段消息以及确认按钮和取消按钮的对话框。 createPopup() 创建一个 pop-up 窗口。 focus() 把键盘焦点给予一个窗口。 getSelection() 返回一个 Selection 对象,表示用户选择的文本范围或光标的当前位置。 getComputedStyle() 获取指定元素的 CSS 样式。 matchMedia() 该方法用来检查 media query 语句,它返回一个 MediaQueryList对象。 moveBy() 可相对窗口的当前坐标把它移动指定的像素。 moveTo() 把窗口的左上角移动到一个指定的坐标。 open() 打开一个新的浏览器窗口或查找一个已命名的窗口。 print() 打印当前窗口的内容。 prompt() 显示可提示用户输入的对话框。 resizeBy() 按照指定的像素调整窗口的大小。 resizeTo() 把窗口的大小调整到指定的宽度和高度。 scroll() 已废弃。 该方法已经使用了 scrollTo() 方法来替代。 scrollBy() 按照指定的像素值来滚动内容。 scrollTo() 把内容滚动到指定的坐标。 setInterval() 按照指定的周期(以毫秒计)来调用函数或计算表达式。 setTimeout() 在指定的毫秒数后调用函数或计算表达式。 stop() 停止页面载入。

Navigator对象

*** 1.定义与创建 ***

Navigator 对象包含有关浏览器的信息。

*** 2.对象属性***

appCodeName 返回浏览器的代码名 appName 返回浏览器的名称 appVersion 返回浏览器的平台和版本信息 cookieEnabled 返回指明浏览器中是否启用 cookie 的布尔值 platform 返回运行浏览器的操作系统平台 userAgent 返回由客户机发送服务器的user-agent 头部的值

*** 3.对象方法***

方法 描述 javaEnabled() 指定是否在浏览器中启用Java taintEnabled() 规定浏览器是否启用数据污点(data tainting)

Screen对象

*** 1.定义与创建 ***

Screen 对象包含有关客户端显示屏幕的信息。

*** 2.对象属性***

availHeight 返回屏幕的高度(不包括Windows任务栏) availWidth 返回屏幕的宽度(不包括Windows任务栏) colorDepth 返回目标设备或缓冲器上的调色板的比特深度 height 返回屏幕的总高度 pixelDepth 返回屏幕的颜色分辨率(每象素的位数) width 返回屏幕的总宽度

History对象

*** 1.定义与创建 ***

History 对象包含用户(在浏览器窗口中)访问过的 URL。

History 对象是 window 对象的一部分,可通过 window.history 属性对其进行访问。

*** 2.对象属性***

length 返回历史列表中的网址数

*** 3.对象方法***

back() 加载 history 列表中的前一个 URL forward() 加载 history 列表中的下一个 URL go() 加载 history 列表中的某个具体页面

Location对象

*** 1.定义与创建 ***

Location 对象包含有关当前 URL 的信息。

Location 对象是 window 对象的一部分,可通过 window.Location 属性对其进行访问。

*** 2.对象属性***

hash 返回一个URL的锚部分 host 返回一个URL的主机名和端口 hostname 返回URL的主机名 href 返回完整的URL pathname 返回的URL路径名。 port 返回一个URL服务器使用的端口号 protocol 返回一个URL协议 search 返回一个URL的查询部分

*** 3.对象方法***

assign() 载入一个新的文档 reload() 重新载入当前文档 replace() 用新的文档替换当前文档

*** Object对象的方法***

Object 对象的原生方法分成两类:Object 本身的方法与Object 的实例方法。

(1) 本身的方法 本身的方法就是直接定义在 Object 对象的方法。

*** 1. 遍历对象属性***

  • Object.keys():遍历对象自身的(非继承的)可枚举属性,返回属性名。
  • Object.getOwnPropertyNames():遍历对象自身的(非继承的)全部(可枚举+不可枚举历)属性。
  • Object.values():遍历对象自身的(非继承的)可枚举属性,返回属性值。
  • Object.entries():遍历对象自身的(非继承的)可枚举属性,返回键值对。

*** 2. 对象的属性描述对象相关方法***

  • Object.getOwnPropertyDescriptor():获取某个属性的描述对象。
  • Object.getOwnPropertyDescriptors():获取对象的所有属性的描述对象。
  • Object.defineProperty():定义某个属性的描述对象。
  • Object.defineProperties():定义多个属性的描述对象。

*** 3. 控制对象状态的方法***

  • Object.preventExtensions():防止对象扩展,无法添加新属性。
  • Object.isExtensible():判断对象是否可扩展。
  • Object.seal():禁止对象配置,无法添加新属性,无法删除属性。
  • Object.isSealed():判断一个对象是否可配置。
  • Object.freeze():冻结一个对象,无法添加新属性,无法删除属性,无法改变属性值。
  • Object.isFrozen():判断一个对象是否被冻结。

*** 4. 原型链相关方法***

  • Object.create():以参数为原型返回一个新的实例对象。
  • Object.getPrototypeOf():获取对象的原型对象。
  • Object.setPrototypeOf():设置对象的原型对象。

*** 5. 其它***

  • Object.assign()
  • Object.is()

(2) 实例方法

实例方法就是定义在 Object 原型对象 Object.prototype 上的方法。它可以被 Object 实例直接使用。

Object 实例对象的方法,主要有以下六个:

Object.prototype.valueOf():返回当前对象对应的值。 Object.prototype.toString():返回当前对象对应的字符串形式。 Object.prototype.toLocaleString():返回当前对象对应的本地字符串形式。 Object.prototype.hasOwnProperty():判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性。 Object.prototype.isPrototypeOf():判断当前对象是否为另一个对象的原型。 Object.prototype.propertyIsEnumerable():判断对象自身的(非继承的)属性是否可枚举。

*** 方法详解 ***

*** 1.Object.assign() ***

1.可以用作对象的复制

var obj = { a: 1 };
var copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }
2.可以用作对象的合并

var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };

var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1);  // { a: 1, b: 2, c: 3 } 注意目标对象自身也会改变。
3.目标对象o1自身也发生了改变,假如不想让o1改变,可以把三个对象合并到一个空的对象中,操作如下:

 var obj = Object.assign({},o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1);  // { a: 1 }
注意:以下几个地方
1.继承属性和不可枚举属性是不能拷贝的

var obj = Object.create({foo: 1}, { // foo 是个继承属性
    bar: {
        value: 2  // bar 是个不可枚举属性。
    },
    baz: {
        value: 3,
        enumerable: true  // baz 是个自身可枚举属性
    }
});

var copy = Object.assign({}, obj);
console.log(copy); // { baz: 3 }
2.原始类型会被包装为 object

var v1 = "abc";
var v2 = true;
var v3 = 10;
var v4 = Symbol("foo")

var obj = Object.assign({}, v1, null, v2, undefined, v3, v4); 
// 原始类型会被包装,null 和 undefined 会被忽略
// 注意,只有字符串的包装对象才可能有自身可枚举属性
console.log(obj); // { "0": "a", "1": "b", "2": "c" }

*** 2.Object.is() ***

用来判断两个值是否是同一个值。

Object.is('haorooms', 'haorooms');     // true
Object.is(window, window);   // true

Object.is('foo', 'bar');     // false
Object.is([], []);           // false

var test = { a: 1 };
Object.is(test, test);       // true

Object.is(null, null);       // true

// 特例
Object.is(0, -0);            // false
Object.is(-0, -0);           // true
Object.is(NaN, 0/0);         // true
Object.keys(obj)

*** 3.Object.keys() ***

返回一个由一个给定对象的自身可枚举属性组成的数组, 数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致

(两者的主要区别是 一个 for-in 循环还会枚举其原型链上的属性)。

// simple array
var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']

// array like object
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj)); // console: ['0', '1', '2']

// array like object with random key ordering
var anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj)); // console: ['2', '7', '100']

// getFoo is a property which isn't enumerable
var myObj = Object.create({}, {
  getFoo: {
    value: function () { return this.foo; }
  } 
});
myObj.foo = 1;
console.log(Object.keys(myObj)); // console: ['foo']

*** object.values()***

var an_obj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.values(an_obj)); // ['b', 'c', 'a']
 
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.values(obj)); // ['a', 'b', 'c']

*** object.entries()***

返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性)。

const obj = { foo: 'bar', baz: 42 };
console.log(Object.entries(obj)); // [ ['foo', 'bar'], ['baz', 42] ]     
const simuArray = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.entries(simuArray)); // [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ]