arguments 对象与形参联动关系

strict mode 中,函数的 arguments 对象的属性值,就是传入该函数的实参的简单拷贝,它们与形参之间的值不存在动态的联动关系

非严格模式下的函数,函数的 arguments 对象的属性与绑定在该函数执行环境中的形参共享值。 换句话说,改变该 arguments 对象的属性将改变对应的形参值,反之亦然。 不过,如果其中一个属性被删除然后再重设值,则会打破这种联动关系。

下面用一个简单的例子来说明这些现象。

代码

// strict mode
;(function test(a) {
'use strict';
console.log(arguments[0]) // 1
console.log(a) // 1
a = 2
console.log(arguments[0]) // 1
console.log(a) // 2
})(1)
// 非strict mode
;(function test2(a) {
// 初始一一对应
console.log(arguments[0]) // 1
console.log(a) // 1
// 修改形参 a,参数对象联动变化
a = 2
console.log(arguments[0]) // 2
arguments[0] = 1
console.log(a) // 1
// delete 属性再重新设值,则不在联动
delete arguments[0]
arguments[0] = 3
console.log(arguments[0]) // 3
console.log(a) // 1
})(1)
READ MORE...

构造函数的返回值

构造函数不需要显式 return,如果指定了返回值,则根据返回值的类型有不同的结果。

代码:

function PrimitiveUndefined() { }
function PrimitiveNull() { return null }
function PrimitiveBoolean() { return true }
function PrimitiveNumber() { return 123 }
function PrimitiveString() { return 'string' }
function PrimitiveSymbol() { return Symbol() }
function BooleanObject() { return new Boolean(true) }
function NumberObject() { return new Number(123) }
function StringObject() { return new String('string') }
function DateObject() { return new Date() }
function RegExpObject() { return /test/ }
function FunctionObject() { return function(){} }
function LiteralObject() { return {} }
function LiteralArray() { return [] }
const FUNCTIONS = [
'PrimitiveUndefined',
'PrimitiveNull',
'PrimitiveBoolean',
'PrimitiveNumber',
'PrimitiveString',
'PrimitiveSymbol',
'BooleanObject',
'NumberObject',
'StringObject',
'DateObject',
'RegExpObject',
'FunctionObject',
'LiteralObject',
'LiteralArray'
]
FUNCTIONS.forEach(func => {
let obj = eval('new ' + func)
let type = obj.constructor.name
console.log('%c%s %c: %c%s',
'color:#607ed8', func,
'color:#888',
'color:#d87860', type)
})

测试结果打印:

PrimitiveUndefined : PrimitiveUndefined
PrimitiveNull : PrimitiveNull
PrimitiveBoolean : PrimitiveBoolean
PrimitiveNumber : PrimitiveNumber
PrimitiveString : PrimitiveString
PrimitiveSymbol : PrimitiveSymbol
BooleanObject : Boolean
NumberObject : Number
StringObject : String
DateObject : Date
RegExpObject : RegExp
FunctionObject : Function
IteralObject : Object
IteralArray : Array

总结

  • 若手动 return 一个原始类型的值 (primitive value),则 return 语句不会起作用,仍然返回构造函数隐式创建的对象。
  • 若手动 return 一个对象类型的值,则会丢弃构造函数隐式创建的对象,返回 return 语句指定的对象。
READ MORE...

离线应用与 manifest.appcache

manifest 文件是一个文本文件,用来告诉浏览器缓存资源的规则,可以用来构建一个离线可用的应用。

manifest 文件的 MIME 类型是 text/cache-manifest

manifest 文件使用时只需简单地在 html 文件中引入。具体方法是,在 <html> 标签中,增加一个 manifest 属性,该属性引用一个 manifest.appcache 文件来描述资源的缓存情况。

代码如下:

<!DOCTYPE html>
<html lang="en" manifest="manifest.appcache">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
</body>
</html>

浏览器兼容性

在使用前,我们都关心的兼容性…

  • IE 10+
  • Chrome 4+
  • Safari 4+
  • Firefox 3.5+
  • Opera 11.5+
  • Safari (iOS)
  • Android Browser
  • Edge

现代浏览器都有支持,尽管实现上据说都有坑。

manifest 已从标准中移除,将来浏览器随时可能会枪毙该特性…
然而,后继者 service workers 还未获得广泛的支持。

READ MORE...