原生JS:全局属性、全局方法详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
原⽣JS:全局属性、全局⽅法详解
全局属性、全局⽅法
原创⽂章,转摘请注明出处:苏福:
⾸先普及⼏个我总结的⾮常实⽤⼜很基础的知识:(呵呵,仅仅是学习权威指南的笔记⽽已)
typeof 返回的是字符串,有8种可能:"number"、"string"、"boolean"、"object"、"function"、"undefined"、"symbol"(ES6)、宿主对象类型
假值:false、 null、 undefined、 0 、-0 、NaN、""
真值:除了以上的值,其他值均为真值;
对象:除了字符串字⾯量、数字字⾯量、true、false、null、undefined之外,其他值都是对象!
数字a 转字符串:
a.toString(n) //n表⽰进制
a.toFixed(i) a.toPrecision(j) //i为⼩数位数,j为要显⽰位数
a.toExponential(i) //科学计数形式
字符串s 转数字:转换失败返回NaN,忽略前置的空格,尽可能多的转换数字,忽略后⾯的⾮数字内容,其中'0X'、'0x'开头的则把它当着16进制数来转换
parseInt(s,n) //n表⽰进制,可选参数,把s当着n进制数来转为⼗进制数
parseFloat(s) //转为浮点数
正题开始:(以下是本⼈⼀边翻书,⼀边查MDN,⼀边 baidu,权衡之后得到的总结)
表⽰⼀个简单的值的全局属性:
⼀个数值,表⽰⽆穷⼤,有Infinity和-Infinity。
Infinity 的初始值是。
⽤0作除数会产⽣Infinity
⽐⽆穷⼤还⼤的值仍然是⽆穷⼤
Infinity(正⽆穷⼤)⼤于任何值。
该值和数学意义上的⽆穷⼤很像,例如任何正值乘以 Infinity 结果为 Infinity, 任何数值(除了Infinity 和 -Infinity)除以 Infinity 为 0。
NaN 属性是⼀个不可配置(non-configurable)、不可枚举、不可写(non-writable)的属性,所以⽆法使⽤ for/in 循环来枚举 NaN 属性,也不能⽤ delete 运算符来删除它。
表⽰ Not-A-Number 的值。
NaN 属性的初始值就是 NaN,和 Number.NaN 的值⼀样。
在现代浏览器中(ES5中), NaN 属性是⼀个不可配置(non-configurable)、不可枚举、不可写(non-writable)的属性,所以⽆法使⽤ for/in 循环来枚举 NaN 属性,也不能⽤ delete 运算符来删除它。
但在ES3中,这个属性的值是可以被更改的,但是也应该避免覆盖。
等号运算符(== 和 ===)不能被⽤来判断⼀个值是否是 NaN。
必须使⽤或函数。
NaN 与所有值都不相等,包括它⾃⼰(在JavaScript中唯⼀⼀个不等于⾃⼰的值):NaN === NaN; // false
NaN是⼀个数字,类型为number :typeof NaN //number
NaN转为数字为NaN,转为布尔值为false
0 除以0会返回NaN ,但是其他数除以0则不会返回NaN,⽽是Infinity。
在JavaScript中,undefined这个词有多重含义。
undefined是全局对象的⼀个属性
⼀个未初始化的变量的值为undefined,⼀个没有传⼊实参的形参变量的值为undefined,如果⼀个函数什么都不返回,则该函数默认返回undefined.
⾸字母⼤写的Undefined表⽰的是⼀种数据类型,⼩写的undefined表⽰的是属于这种数据类型的唯⼀的⼀个值.
在JavaScript代码中,你看到的undefined最有可能是全局对象的⼀个属性,该属性的初始值是就是前⾯所说的原始值undefined,还有种情况就是,这个undefined是个局部变量,就像其他普通变量⼀样,没有任何特殊性,它的值不⼀定是undefined,但通常情况下都是的.下⾯我们所说的undefined,都指的是window.undefined这个属性.
在ES5中,window.undefined成了⼀个不可写,不可配置的数据属性,它的值永远是undefined,但是undefined这个词不是保留字,可以被重新声明并赋值,所以直接使⽤undefined是不保险的,可以⽤void 0来获得⼀个纯正的undefined。
必须使⽤严格相等运算符===来判断⼀个值是否是undefined,⽽不能使⽤普通的相等运算符==,因为在JavaScript中
null == undefined是返回true的
如果⼀个变量根本没有被声明,只有使⽤typeof判断才不会报错typeof x === 'undefined'。
⽤相等运算符判断会抛出异常。
(对已声明但未初始化的和未声明的变量执⾏typeof,都返回"undefined"。
)
undefined转为数字为NaN,转为布尔值为false
null 是⼀个javascript字⾯量,表⽰空值,它是javascript原始值之⼀。
null 常被放在期望⼀个对象,但是不引⽤任何对象的参数位置,null表⽰⼀个空对象指针,typeof操作会返回"object"。
在 JavaScript 最初的实现中,JavaScript 中的值是由⼀个表⽰类型的标签和实际数据值表⽰的。
对象的类型标签是0。
由于null代表的是空指针(⼤多数平台下值为0x00),因此,null的类型标签也成为了0,typeof null就错误的返回了"object".
null转为数字为0,转为布尔值为false
null 与 undefined 的区别:null是字⾯量,undefined是全局对象的属性
typeof null // object
typeof undefined // undefined
null === undefined // false
null == undefined // true(null会执⾏类型转换)
null与空对象{}的区别:个⼈理解为null未被分配内存,⽽{}分配了内存,只是值为空
var a = {};
var b = null;
= 'realwall';
= 'jim'; //这⾥会报错,b为空指针对象,不能像普通对象⼀样直接添加属性。
执⾏特定功能并返回结果的全局⽅法:
eval()是⼀个顶级函数并且跟任何对象⽆关。
eval()的参数是⼀个字符串。
如果字符串表⽰了⼀个表达式,eval()会对表达式求值。
如果参数表⽰了⼀个或多个JavaScript声明,那么eval()会执⾏声明。
不要调⽤eval()来为算数表达式求值; JavaScript 会⾃动为算数表达式求值。
如果要将算数表达式构造成为⼀个字符串,你可以⽤eval()在随后对其求值。
如果参数不是原始字符串,eval()将会将参数原封不动的返回。
eval()只能直接调⽤,不可以间接调⽤,如使⽤变量来引⽤eval(),然后调⽤它。
那么可能会发⽣运⾏时错误
eval只是⼀个普通的函数,只不过他有⼀个快速通道通向编译器,可以将string变成可执⾏的代码。
当Function , setInterval 和
setTimeout这⼏个⽅法接收⼀个字符串作为参数时,内部调⽤了eval()⽅法
eval通常⽤在⼀些需要动态执⾏字符串,或将字符串转为javascript对象的场景,⽐如将json字符串转为javascript对象。
eval()函数并不会创建⼀个新的作⽤域,并且它的作⽤域就是它所在的作⽤域。
可以⽤window.eval()的⽅式来把它的作⽤域变为全局(兼容IE8的对应⽅法为window.execScript)
避免在不必要的情况下使⽤eval:eval() 是⼀个危险的函数,它可以像拥有调⽤者的权⼒⼀样调⽤代码。
如果你使⽤了字符串来运⾏eval(),那么你的代码可能被恶意⽅(不怀好意的⼈)影响, 通过在使⽤⽅的机器上使⽤恶意代码,可能让你失去在⽹页或者扩展程序上的权限。
eval() 可读性差、不⽅便优化和调试、有性能消耗。
在任何实⽤eval()的地⽅,基本都可以有⼀般的替代⽅案
testValue
它是全局⽅法,不与任何对象有关系。
你可以⽤这个⽅法来判定⼀个数字是否是有限数字。
isFinite ⽅法检测它参数的数值。
他会⾸先尝试将参数转换为⼀个数值,如果参数是 NaN、Infinity、-Infinity,则返回false,其他返回 true。
testValue
⽤来判断⼀个值是否为。
注:isNaN函数包含⼀些⾮常有意思的强制转换规则;你也可以通过 ECMAScript 6 中定义的或者来判断⼀个值是否为⾮数值
如果isNaN函数的参数不是类型, isNaN()会⾸先尝试将这个参数转换为数值,然后才会对转换后的结果是否是进⾏判断(空字符串和布尔值会被强制转换为数值0或1,对它们isNaN返回false)⽽isNaN(undefined)返回true
ECMAScript (ES6)包含了函数。
通过Number.isNaN(x)来检测变量x是否是⼀个⾮数值将会是⼀种可靠的做法。
然⽽,在缺
少Number.isNaN函数的情况下, 通过表达式(x != x) 来检测变量x是否是NaN会更加可靠。
string
将参数中指定的字符串解析成为⼀个浮点数字并返回.parseFloat是个全局函数,不属于任何对象.
参数字符串前置的空⽩符会被忽略。
它会正确解析:正负号(+或-),数字(0-9),⼩数点,或者科学记数法中的指数(e或E),当它遇到其它字符时,会忽略之后的所有字符,并⽴即返回结果
如果参数字符串的第⼀个字符不能被解析成为数字,则parseFloat返回NaN
最好通过调⽤函数来判断parseFloat的返回结果是否是NaN。
如果让NaN作为了任意数学运算的操作数,则运算结果必定也是NaN.
parseFloat 也可转换和返回Infinity值. 可以使⽤函数来判断结果是否是⼀个优先的数值 (⾮Infinity, -Infinity, 或 NaN).
该函数通过正则表达式的⽅式,在需要更严格地转换float值时可能会有⽤: (只接受纯数字值)
var filterFloat = function (value) {
if(/^(\-|\+)?([0-9]+(\.[0-9]+)?|Infinity)$/.test(value)){
return Number(value);
}
return NaN;
}
string, radix
将给定的字符串以指定基数(radix/base)解析成为整数。
radix是⼀个2到36之间的整数值,⽤于指定转换中采⽤的基数。
⽐如参数"10"表⽰使⽤我们通常使⽤的⼗进制数值系统。
总是指定该参数可以消除阅读该代码时的困惑并且保证转换结果可预测。
当忽略该参数时,不同的实现环境可能产⽣不同的结果。
parseInt 函数将第⼀个参数(字符串)解析并试图返回⼀个整数或者NaN(Not a Number)。
如果第⼀个字符不能被转换成数字,parseInt返回NaN。
如果结果不是NaN,那么返回值是把第⼀个参数看作是radix参数指定的进制下的数,然后把它转换成⼗进制的整数
如果 parseInt 遇到了不属于radix参数所指定的基数中的字符,那么该字符和其后的字符都将被忽略。
接着返回已经解析的整数部分。
parseInt 将截取整数部分。
开头和结尾的空⽩符允许存在,会被忽略。
parseInt("10546", 2); //2
parseInt("546", 2); //NaN
parseInt("FXX123", 16); //15
parseInt("12",13); //15
parseInt(" -17", 8); //-15
parseInt("0x11", 16); //17
parseInt("0x11", 0); //17
parseInt("0x11"); //17
在没有指定基数,或者基数为 0 的情况下,JavaScript 作如下处理:
如果字符串 string 以"0x"或者"0X"开头, 则基数是16 (16进制).
如果字符串 string 以"0"开头, 基数是8(⼋进制)或者10(⼗进制),那么具体是哪个基数由实现环境决定。
ECMAScript 5 规范不再允许parseInt函数的实现环境把以0字符开始的字符串作为⼋进制数值,ECMAScript 5 规定使⽤10,但是并不是所有的浏览器都遵循这个规定。
因此,永远都要明确给出radix参数的值。
如果字符串 string 以其它任何值开头,则基数是10 (⼗进制)。
⼀个更严格的⽅法来解析整型值:(任何不具有实际意义数字值的值均返回NaN)
filterInt = function (value) {
if(/^(\-|\+)?([0-9]+|Infinity)$/.test(value)){
return Number(value);
}
return NaN;
}
filterInt('421op'); //NaN
URI
对统⼀资源标识符(URI)进⾏编码的⽅法。
它使⽤1到4个转义序列来表⽰每个字符的UTF-8编码(只有由两个代理字符区组成的字符才⽤四个转义字符编码)。
参数URI是⼀个完整的URI.
假定⼀个URI是完整的URI,那么⽆需对那些保留的并且在URI中有特殊意思的字符进⾏编码。
encodeURI 会替换除以下字符之外的所有字符,即使它们具有适当的UTF-8转义序列:
类型包含
保留字符; , / ? : @ & = + $
⾮转义的字符字母数字 - _ . ! ~ * ' ( )
数字符号#
请注意,encodeURI ⾃⾝⽆法产⽣能适⽤于HTTP GET 或 POST 请求的URI,例如对于 XMLHTTPRequests, 因为 "&", "+", 和 "=" 不会被编码,然⽽在 GET 和 POST 请求中它们是特殊字符。
然⽽这个⽅法会对这些字符编码。
另外,如果试图编码⼀个⾮⾼-低位完整的代理字符,将会抛出⼀个错误,例如:
// 编码⾼-低位完整字符
console.log(encodeURI('\uD800\uDFFF'));
// 编码单独的⾼位字符抛出 "Uncaught URIError: URI malformed"
console.log(encodeURI('\uD800'));
// 编码单独的低位字符抛出 "Uncaught URIError: URI malformed"
console.log(encodeURI('\uDFFF'));
并且需要注意,如果URL需要遵循较新的标准,那么⽅括号是被保留的(给IPv6),因此对于那些没有被编码的URL部分(例如主机),可以使⽤下⾯的代码:
function fixedEncodeURI (str) {
return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']');
}
是对统⼀资源标识符(URI)的组成部分进⾏编码的⽅法。
它使⽤⼀到四个转义序列来表⽰字符串中的每个字符的UTF-8编码(只有由两个Unicode代理区字符组成的字符才⽤四个转义字符编码)。
参数str是String. URI 的组成部分。
它转义除了字母、数字、(、)、.、!、~、*、'、-和_之外的所有字符。
注意,如果试图编码⼀个⾮⾼-低位完整的代理字符,将会抛出⼀个错误
为了避免服务器收到不可预知的请求,对任何⽤户输⼊的作为URI部分的内容你都需要⽤encodeURIComponent进⾏转义。
⽐如,⼀个⽤户可能会输⼊"Thyme &time=again"作为comment变量的⼀部分。
如果不使⽤encodeURIComponent对此内容进⾏转义,服务器得到的将是comment=Thyme%20&time=again。
请注意,"&"符号和"="符号产⽣了⼀个新的键值对,所以服务器得到两个键值对(⼀个键值对是comment=Thyme,另⼀个则是time=again),⽽不是⼀个键值对。
对于 (POST) 这种数据⽅式,空格需要被替换成 '+',所以通常使⽤encodeURIComponent 的时候还会把 "%20" 替换为 "+"。
为了更严格的遵循(它保留 !, ', (, ), 和 *),即使这些字符并没有正式划定 URI 的⽤途,下⾯这种⽅式是⽐较安全的:
function fixedEncodeURIComponent (str) {
return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
}
encodedURI
⽤于解码由⽅法或者其它类似⽅法编码的统⼀资源标识符(URI)。
将已编码 URI 中所有能识别的转义序列转换成原字符,但不能解码那些不会被编码的内容(例如 "#")
decodeURI("https:///ru/docs/JavaScript_%D1%88%D0%B5%D0%BB%D0%BB%D1%8B");
// "https:///ru/docs/JavaScript_шеллы"
encodedURI
⽤于解码由⽅法或者其它类似⽅法编码的部分统⼀资源标识符(URI)。
参数encodedURI 是编码后的部分 URI
已被废弃
已被废弃。