ECMAScript原生JS:全局属性、全局方法详解

全局属性、全局方法

原创著作,转摘请注脚出处:苏福:http://www.cnblogs.com/susufufu/p/5853342.html

率先普及多少个自我总括的分外实用又很基础的文化:(呵呵,仅仅是学习权威指南的笔记而已)

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。

  • Infinity 的初步值是 Number.POSITIVE_INFINITY
  • 用0作除数会生出Infinity
  • 比无穷大还大的值依然是无穷大

  • Infinity(正无穷大)大于其他值。该值和数学意义上的无限大很像,例如任何正值乘以 Infinity 结果为 Infinity, 任何数值(除了Infinity 和
    -Infinity)除以 Infinity 为
    0。
  • NaN 属性是一个不足配置(non-configurable)、不可枚举、不可写(non-writable)的性能,所以不可能利用 for/in
    循环来枚举 NaN 属性,也不可能用 delete
    运算符来删除它。

NaN

表示 Not-A-Number 的值。NaN 属性的起始值就是 NaN,和 Number.NaN 的值一样。

  • 在当代浏览器中(ES5中), NaN 属性是一个不行配置(non-configurable)、不可枚举、不可写(non-writable)的性质,所以不可以使用 for/in
    循环来枚举 NaN 属性,也无法用 delete
    运算符来删除它。
  • 但在ES3中,这些特性的值是可以被更改的,然而也应当避免覆盖。
  • 等号运算符(== 和 ===) 不可能被用来判断一个值是否是 NaN。必须使用 Number.isNaN() 或 isNaN() 函数。
  • NaN
    与所有值都不等于,包括它自己(在JavaScript中唯一一个不对等自己的值):NaN === NaN;        //
    false
  • NaN是一个数字,类型为number :typeof NaN
     //number 
  • NaN转为数字为NaN,转为布尔值为false

  • 0 除以0会回到NaN
    ,不过任何数除以0则不会重回NaN,而是Infinity。

undefined

在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 

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;

a.name = ‘realwall’;

b.name = ‘jim’; //这里会报错,b为空指针对象,不可以像平时对象一样一向添加属性。

 

施行一定效能并回到结果的全局方法:

eval(string)

eval()是一个甲级函数并且跟另外对象无关。

  • eval()的参数是一个字符串。假设字符串表示了一个表明式,eval()会对表明式求值。要是参数表示了一个或五个JavaScript讲明, 那么eval()会履行注脚。不要调用eval()来为算数表明式求值; JavaScript
    会自动为算数表明式求值。

  • 假如要将算数表达式构造成为一个字符串,你可以用eval()在随后对其求值。

  • 一旦参数不是原始字符串,eval()将会将参数原封不动的回来。
  •  eval()只好直接调用,不可以间接调用,如拔取变量来引用eval(),然后调用它。那么可能会时有暴发运行时不当

  •  eval只是一个家常的函数,只可是他有一个飞速通道通向编译器,可以将string变成可举办的代码。当Function
    , setInterval 和
    set提姆eout那一个艺术接收一个字符串作为参数时,内部调用了eval()方法

  •  eval通常用在一些需要动态执行字符串,或将字符串转为javascript对象的情景,比如将json字符串转为javascript对象。

  •  eval()函数并不会创立一个新的效率域,并且它的功用域就是它所在的成效域。可以用window.eval()的章程来把它的效用域变为全局(兼容IE8的应和措施为window.execScript)

  • 避免在不必要的气象下使用eval:eval() 是一个惊险的函数, 它可以像拥有调用者的权柄一样调用代码。要是您利用了字符串来运作eval(),那么你的代码可能被恶意方(不怀好意的人)影响,
    通过在使用方的机器上应用恶意代码,可能让你错过在网页依旧扩张程序上的权力。eval() 可读性差、不便利优化和调节、有总体性消耗。在此外实用eval()的地点,基本都足以有类同的代表方案 

isFinite(testValue)

它是大局方法,不与另外对象有涉嫌。你可以用这几个措施来判定一个数字是否是有限数字。isFinite 方法检测它参数的数值。他会首先尝试将参数转换为一个数值,假使参数是 NaN、Infinity、-Infinity,则赶回false,其他重回 true。

isNaN(testValue)

用来判断一个值是否为 NaN。注:isNaN函数包含部分特别有意思的威吓转换规则;你也可以透过 ECMAScript 6
中定义的 Number.isNaN() 或者 typeof 来判断一个值是否为非数值

  • 假若isNaN函数的参数不是Number系列, isNaN()会首先尝试将以此参数转换为数值,然后才会对转移后的结果是否是NaN展开判断(空字符串和布尔值会被威逼转换为数值0或1,对它们isNaN重回false)而isNaN(undefined)重临true

  • ECMAScript (ES6)包含了Number.isNaN()函数。通过Number.isNaN(x)来检测变量x是否是一个非数值将会是一种保险的做法。不过,在紧缺Number.isNaN函数的情状下, 通过表明式(x != x) 来检测变量x是否是NaN会更加可靠。

parseFloat(string)

将参数中指定的字符串解析成为一个浮点数字并再次来到.parseFloat是个全局函数,不属于此外对象.

  • 参数字符串前置的空白符会被忽略。
  • 它会正确分析:正负号(+或-),数字(0-9),小数点,或者科学记数法中的指数(e或E),当它遭遇其他字符时,会忽略之后的保有字符,并登时赶回结果
  • 假设参数字符串的率先个字符不能够被分析成为数字,则parseFloat再次来到NaN

  • 最好通过调用isNaN函数来判断parseFloat的回到结果是否是NaN。假如让NaN作为了自由数学运算的操作数,则运算结果肯定也是NaN.

  • parseFloat 也可更换和重返Infinity值. 可以使用isFinite 函数来判断结果是否是一个事先的数值
    (非Infinity, -Infinity, 或 NaN).
  • 该函数通过正则表明式的格局,在急需更严刻地转换float值时莫不会立竿见影:
    (只接受纯数字值)

    var filterFloat = function (value) {
    if(/^(-|+)?([0-9]+(.[0-9]+)?|Infinity)$/.test(value)){
    return Number(value);
    }
    return NaN;
    }

 

parseInt(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

 

encodeURI(ECMAScript,URI)

对统一资源标识符(URI)举行编码的形式。它应用1到4个转义连串来表示每个字符的UTF-8编码(只有由五个代理字符区组成的字符才用三个转义字符编码)。参数URI是一个完好无缺的URI.

  • 如若一个URI是完整的URI,那么无需对这多少个保留的同时在URI中有新鲜意思的字符举行编码。
  • encodeURI 会替换除以下字符之外的有着字符,即便它们具有确切的UTF-8转义连串:

类型

包含

保留字符

; , / ? : @ & = + $

非转义的字符

字母 数字 – _ . ! ~ * ‘ ( )

数字符号

#

  • 请注意,encodeURI 自身无法爆发能适用于HTTP GET 或 POST
    请求的URI,例如对于 XMLHTTPRequests, 因为 “&”, “+”, 和 “=”
    不会被编码,然则在 GET 和 POST 请求中它们是特殊字符。然则encodeURIComponent以此方法会对这一个字符编码。

  • 除此以外,倘使准备编码一个非高-低位完整的代理字符,将会抛出一个 URIError 错误,例如:

    // 编码高-低位完整字符
    console.log(encodeURI(‘\uD800\uDFFF’));
    // 编码单独的要职字符抛出 “Uncaught URIError: URI malformed”
    console.log(encodeURI(‘\uD800’));
    // 编码单独的没有字符抛出 “Uncaught URIError: URI malformed”
    console.log(encodeURI(‘\uDFFF’));

  • 而且需要留意,假如URL需要依照较新的RFC3986正规,那么方括号是被封存的(给IPv6),由此对于那一个并未被编码的URL部分(例如主机),可以接纳下边的代码:

    function fixedEncodeURI (str) {
      return encodeURI(str).replace(/%5B/g, ‘[‘).replace(/%5D/g, ‘]’);
    }

 

encodeURIComponent(str)

是对联合营源标识符(URI)的组成部分进行编码的方法。它利用一到两个转义体系来表示字符串中的每个字符的UTF-8编码(唯有由六个Unicode代理区字符组成的字符才用五个转义字符编码)。参数str是String.
URI 的组成部分。

  • 它转义除了字母、数字、(、)、.、!、~、*、’、-和_之外的享有字符。

  • 专注,假诺打算编码一个非高-低位完整的代理字符,将会抛出一个 URIError 错误

  • 为了避免服务器收到不可预知的伸手,对其他用户输入的作为URI部分的内容你都需要用encodeURIComponent举办转义。比如,一个用户可能会输入”Thyme &time=again”作为comment变量的一局部。假如不使用encodeURIComponent对此内容开展转义,服务器得到的将是comment=Thyme%20&time=again。请留意,”&”符号和”=”符号爆发了一个新的键值对,所以服务器得到多少个键值对(一个键值对是comment=Thyme,另一个则是time=again),而不是一个键值对。

  • 对于 application/x-www-form-urlencoded (POST)
    这种多少形式,空格需要被替换成
    ‘+’,所以通常采取encodeURIComponent 的时候还会把 “%20” 替换为 “+”。
  • 为了更严谨的遵照 RFC
    3986
    (它保留 !, ‘, (, ),
    和 *),尽管那多少个字符并从未正儿八经划定 URI
    的用处,下边那种办法是相比较安全的:

    function fixedEncodeURIComponent (str) {

    return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
    

    }

 

decodeURI(encodedURI)

用以解码由 encodeURI 方法如故其余类似情势编码的联结资源标识符(URI)。将已编码 URI
中有所能识此外转义连串转换成原字符,但不可以解码这个不会被 encodeURI 编码的内容(例如
“#”)

 decodeURI("https://developer.mozilla.org/ru/docs/JavaScript_%D1%88%D0%B5%D0%BB%D0%BB%D1%8B");
 // "https://developer.mozilla.org/ru/docs/JavaScript_шеллы"

 

decodeURIComponent(encodedURI)

用来解码由 encodeURIComponent 方法或者其余类似措施编码的有些联独资源标识符(URI)。参数encodedURI
是编码后的有的 URI

escape() 已被丢掉
unescape()  已被撇下