初识JavaScript-基本概念

    xiaoxiao2021-11-06  78

    本人研究生在读,之前学过java,后来对前端开发产生兴趣,果断入坑,所以开始学习JavaScript

    之前学习过java,所以在学习JavaScript基本概念中,很多知识点都是一样,本文只列举 不一样之处,方便以后学习

    变量

    ECMAscript的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。定义变量时用var操作符,后跟变量名。 如以下定义形式: var meesage;

    如果在函数中使用var定义一个变量,那么这个变量在函数退出后就会被销毁。 ​

    function test(){ var message = "hi"; } test(); alert(message);//错误

    但是如果在函数没有使用var定义,则这个变量就会成为全局变量,即退出后仍可以访问。

    fuction test(){ message = "hi"; } test(); alert(message);//“hi”

    但是不推荐上面用法,给未经声明的变量赋值在严格模式下会导致抛出ReferenceError错误。

    数据类型

    ECMAScript中有5种简单的数据类型:Undefined、Null、Boolean、Number、String及Object。

    typeof操作符

    typeof是用来检测给定变量的数据类型。对一个值使用typeof操作符可能返回下列某种情况:

    undefined:如果这个值未定义boolean:如果这个值是布尔值string:如果这个值是字符串number:如果这个值是数值object:如果这个值是对象或nullfunction:如果这个值是函数

    Undefined类型

    Undefined类型只有一个值,即undefined。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined。

    var message; alert(message==undefined);//true

    但是未初始化与未声明变量是不一样的,

    var message; alert(message);//undefined alert(age);//错误

    最后重要一点,对未声明的变量和未初始化的变量使用typeof操作符,都会返回undefined

    var message; alert(typeof message);//undefined alert(typeof age);//undefined

    Null类型

    Null类型也只有一个特殊值-null。从逻辑上看,null值表示一个空指针,所以使用typeof操作符返回的是object。

    var car = null; alert(typeof car);//object

    实际上,undefined值是派生自null的值,因此规定他们相等性会返回true。 alert(null==undefined);//true

    Boolean类型

    该类型只有两个字面值:true和false,且其字面值也是区分大小写的。

    要将一个值转换为对应的Boolean值,可以调用其转型函数Boolean()。

    var message = "Hello world!"; var messageAsBoolean = Boolean(message);

    可以对任何数据类型的值调用Boolean()函数,而且总会返回一个Boolean值。

    数据类型转换为true的值转换为false的值BooleantruefalseString非空字符串“ ”(空字符串)Number非零数值0和NaNObject任何对象nullUndefined不适用undefined

    Number类型

    由于保存浮点数值需要的内存空间是保存整数数值的两倍,所以ECMAScript会将浮点数值转换为整数数值。

    ECMAScript能表示最小的数值保存在Number.MIN_VALUE,这个值是5e-324。最大的数值保存在Number.MAX_VALUE,这个值是1.7976931348623157e+308。

    如果得到的数值超出了数值范围的值,则这个数值会自动转为特殊的Infinity值,如果是负数,则转为-Infinity,如果是正数,则转为Infinity。

    NaN表示一个本来要返回的数值的操作数未返回值得情况。在ECMAScript中,任何数值除以非数值会返回NaN。

    NaN两个特点:

    任何涉及NaN的操作都会返回NaN。NaN 与任何值都不相等,包括 NaN 本身

    ECMAScript 定义了isNaN()函数。这个函数接受一个参数,该参数可以是任何类型,而函数会帮确定这个参数是否“不是数值”。isNaN()在接收到一个值之后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值。而任何不能被转换为数值的值都会导致这个函数返回 true。

    alert(isNaN(NaN));//true alert(isNaN("10"));//false,转化为数字10 alert(isNaN(true));//false,转化为1 alert(isNaN("blue"));//true,不能转化为数字

    在基于对象调用isNaN()函数时,会首先调用对象的valueOf()方法,然后确定该方法返回的值是否可以转换为数值。如果不能,则基于这个返回值再调用 toString()方法,再测试返回值 。

    有 3 个函数可以把非数值转换为数值:Number()、 parseInt()和parseFloat()。第一个函数Number()可以用于任何数据类型,而另两个函数则专门用于把字符串转换成数值。

    Number()函数的转换规则如下。

    如果是 Boolean 值, true 和 false 将分别被转换为 1 和 0。如果是数字值,只是简单的传入和返回。如果是 null 值,返回 0。如果是 undefined,返回 NaN。

    如果是字符串,遵循下列规则:

    如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即”1”会变成 1, “123”会变成 123,而”011”会变成 11(注意:前导的零被忽略了);如果字符串中包含有效的浮点格式,如”1.1”,则将其转换为对应的浮点数值(同样,也会忽略前导零);如果字符串中包含有效的十六进制格式,例如”0xf”,则将其转换为相同大小的十进制整数值;如果字符串是空的(不包含任何字符),则将其转换为 0;如果字符串中包含除上述格式之外的字符,则将其转换为 NaN。

    如果是对象,则调用对象的 valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用对象的 toString()方法,然后再次依照前面的规则转换返回的字符串值。

    因为number()处理较为复杂,所以一般处理整数的时候更常用的是parseInt()函数。parseInt()函数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直至找到第一个非空格字符。如果第一个字符不是数字字符或者负号, parseInt()就会返回 NaN;也就是说,用 parseInt()转换空字符串会返回 NaN(Number()对空字符返回 0) 。如果第一个字符是数字字符, parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。

    alert(parseInt("1234blue"));//1234 alert(parseInt("0xf"));//15,16进制 alert(parseInt("12.4"))//12

    然而在解析八进制这样的字面量时,ECMAScript3和5却不同。

    javascript //ECMAScript3认为num为56(八进制),而ECMAScript认为num为70(十进制) var num = parseInt("070");

    所以为了消除以上问题,可以为此函数提供第二个参数:转换时使用的基数。

    var num = parseInt("070",8);此时转换为8进制的56。

    与 parseInt()函数类似, parseFloat()也是从第一个字符(位置 0)开始解析每个字符。而且也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止。 var num = parseFloat("22.34.5");转换为22.34。

    String类型

    String 类型用于表示由零或多个 16 位 Unicode 字符组成的字符序列,即字符串。字符串可以由双引号(”)或单引号(’)表示 。用双引号表示的字符串和用单引号表示的字符串完全相同 。

    字符字面量

    String 数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者具有其他用途的字符。

    字面量含义\n换行\t制表\b退格\r回车\f进纸\\斜杠\’单引号\”双引号\xnn以十六进制代码nn表示的一个unicode字符\unnn以十六进制代码nnnn表示的一个unicode字符

    这些字符字面量可以出现在字符串中的任意位置,而且也将被作为一个字符来解析 。

    var text = "Hello,World! \n";

    任何字符串的长度都可以通过其length属性获得。

    字符串特点

    ECMAScript 中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。

    转化为字符串

    要把一个值转换为一个字符串有两种方式。第一种是使用几乎每个值都有的toString()方法

    数值、布尔值、对象和字符串值(每个字符串也都有一个 toString()方法,该方法返回字符串的一个副本)都有toString()方法。但 null 和undefined值没有这个方法。 多数情况下,调用 toString()方法不必传递参数。但是,在调用数值的 toString()方法时,可以传递一个参数:输出数值的基数。

    var num = 10; alert(num.toString());//10 alert(num.toString(2));//1010 alert(num.toString(8)); // "12" alert(num.toString(10)); // "10" alert(num.toString(16)); // "a"

    在不知道要转换的值是不是 null 或 undefined 的情况下,还可以使用转型函数 String(),这个 函数能够将任何类型的值转换为字符串。 String()函数遵循下列转换规则:

    如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果;如果值是null,则返回”null”;如果值是undefined,则返回”undefined”。 var value1 = 42; var value2 = true; var value3 = null; var value4; alert(String(value1)); // "42" alert(String(value2)); // "true" alert(String(value3)); // "null" alert(String(value4)); // "undefined"

    Object类型

    ECMAScript 中的对象其实就是一组数据和功能的集合。对象可以通过执行 new 操作符后跟要创建的对象类型的名称来创建。而创建 Object 类型的实例并为其添加属性和(或)方法,就可以创建自定义对象。

    var o = new Object();

    但在 ECMAScript 中,如果不给构造函数传递参数,则可以省略后面的那一对圆括号(但这不是推荐的做法)。

    Object 的每个实例都具有下列属性和方法。

    constructor: 保存着用于创建当前对象的函数。对于前面的例子而言,构造函数 (constructor)就是 Object()。hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定。isPrototypeOf(object):用于检查传入的对象是否是当前对象的原型 。propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用 for-in 语句来枚举。与 hasOwnProperty()方法一样,作为参数的属性名必须以字符串形式指定。toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。toString():返回对象的字符串表示。valueOf():返回对象的字符串、数值或布尔值表示。通常与 toString()方法的返回值相同。

    操作符

    大多数操作符与java语法中一样,本文只列举不同的。

    相等操作符

    相等

    ECMAScript 中的相等操作符由两个等于号(==)表示,如果两个操作数相等,则返回 true。而不相等操作符由叹号后跟等于号(!=)表示,如果两个操作数不相等,则返回 true。这两个操作符都会先转换操作数(通常称为强制转型),然后再比较它们的相等性。

    这两个操作符在进行比较时则要遵循下列规则。

    null 和 undefined 是相等的。要比较相等性之前,不能将 null 和 undefined 转换成其他任何值。如果有一个操作数是 NaN,则相等操作符返回 false,而不相等操作符返回 true。重要提示:即使两个操作数都是 NaN,相等操作符也返回 false;因为按照规则, NaN 不等于 NaN。如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回 true;否则,返回 false。

    全等

    ECMAScript中用===表示未经转化就相等的情况下才返回true。

    var result1 = ("55" == 55);//true var result2 = ("55" === 55);//false

    语句

    for-in语句

    for-in 语句是一种精准的迭代语句,可以用来枚举对象的属性。以下是 for-in 语句的语法: for (property in expression) statement

    ECMAScript 对象的属性没有顺序。因此,通过 for-in 循环输出的属性名的顺序是不可预测的。具体来讲,所有属性都会被返回一次,但返回的先后次序可能会因浏览器而异。 如果表示要迭代的对象的变量值为 null 或 undefined, for-in 语句会抛出错误。ECMAScript 5 更正了这一行为;对这种情况不再抛出错误,而只是不执行循环体。 建议在使用 for-in 循环之前,先检测确认该对象的值不是 null 或 undefined。

    with语句

    with 语句的作用是将代码的作用域设置到一个特定的对象中。 with 语句的语法如下: with (expression) statement; 定义 with 语句的目的主要是为了简化多次编写同一个对象的工作

    var qs = location.search.substring(1); var hostName = location.hostname; var url = location.href; with(location){ var qs = search.substring(1); var hostName = hostname; var url = href; }

    严格模式下不允许使用 with 语句,否则将视为语法错误。

    由于大量使用 with 语句会导致性能下降,同时也会给调试代码造成困难,因此在开发大型应用程序时,不建议使用 with 语句。

    函数

    ECMAScript 中的函数使用 function 关键字来声明,后跟一组参数以及函数体。

    function functionName(arg0, arg1,...,argN) { statements }

    ECMAScript 中的函数在定义时不必指定是否返回值。实际上,任何函数在任何时候都可以通过return 语句后跟要返回的值来实现返回值。

    严格模式对函数有一些限制:

    不能把函数命名为 eval 或 arguments;不能把参数命名为 eval 或 arguments;不能出现两个命名参数同名的情况。

    如果发生以上情况,就会导致语法错误,代码无法执行。

    理解参数

    ECMAScript 函数不介意传递进来多少个参数,也不在乎传进来参数是什么数据类型。 原因是 ECMAScript 中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。如果这个数组中不包含任何元素。实际上,在函数体内可以通过 arguments 对象来访问这个参数数组,从而获取传递给函数的每一个参数。

    其实, arguments 对象只是与数组类似(它并不是 Array 的实例),因为可以使用方括号语法访问它的每一个元素(即第一个元素是arguments[0],第二个元素是 arguments[1],以此类推),使用 length 属性来确定传递进来多少个参数 。

    arguments对象可以与命名参数一起使用,如下面代码

    function doAdd(num1, num2) { if(arguments.length == 1) { alert(num1 + 20); } else if (arguments.length == 2) { arguments[1]=10; alert(arguments[0] + num2); } }

    arguments[0]与num1相同,arguments[1]与num2相同。他们的值一直保持相同。在传入两个参数时,arguments[1]=10会令num2也等于10。然而,他们不是占据同一个,而是占据独立的内存,但它们的值会同步。另外,如果只传入了一个参数,那么为 arguments[1]设置的值不会反映到命名参数中。这是因为 arguments对象的长度是由传入的参数个数决定的,不是由定义函数时的命名参数的个数决定的。

    没有传递值的命名参数将自动被赋予 undefined 值。这就跟定义了变量但又没有初始化一样。

    严格模式对如何使用 arguments 对象做出了一些限制。首先,,即使把 arguments[1]设置为 10, num2 的值仍然还是 undefined。其次,重写arguments 的值会导致语法错误

    理解重载

    ECMAScript 函数不能像传统意义上那样实现重载 。ECMAScirpt函数没有签名,因为其参数是由包含零或多个值的数组来表示的。而没有函数签名,真正的重载是不可能做到的。

    function addSomeNumber(num){ return num + 100; } function addSomeNumber(num) { return num + 200; } var result = addSomeNumber(100); //300

    定义函数addSomeNumber两次,后一个函数会覆盖前一个。

    参考资料

    《JavaScript高级程序设计》

    转载请注明原文地址: https://ju.6miu.com/read-678047.html

    最新回复(0)