javascript的一些基本概念

简介:

本文只涉及到一些基本的概念,适合初学者学习。更高级别的话题,比如类,原型,构造器等建议参考书籍《JavaScript: The Definitive Guide》

类型,值和变量

javascript在整型值和浮点型值之间没有区别,javascript中所有的值都是浮点类型的值。采用64位浮点格式,遵循IEEE754标准。因此最大值为±1.7976931348623157 × 10^308 最小值为±5 × 10^?324. javascript允许你定义精确的整数范围为?9007199254740992 (?2^53) 和9007199254740992 (2^53),

十进制写法

0

3

100000

十六进制写法

0xff

0xCAFE911

浮点数字写法

3.14

.333333333

6.02e23

1.143822E-32

Infinity 和NaN

javascript定义全局变量Infinity 和NaN

Infinity 表示正无穷大,NaN表示not a number

Number.POSITIVE_INFINITY==1/0==Number.MAX_VALUE + 1==Infinity

Number.NEGATIVE_INFINITY==-1/0==-Number.MAX_VALUE - 1==-Infinity

Number.NaN==0/0=NaN

NaN有特殊的之处。它和任何值都不相等,即使是和自己。因此不能用x==NaN来判断x是不是NaN,只能用x!=x来判断是不是NaN,返回true就表明是NaN。也可以用方法isNaN()。

isFinite()方法范虎true,当且仅当参数不是NaN,Infinity或者 -Infinity 的时候。

null和undefined

null表示空值,可以认为是一个特殊的对象值,表示无对象。和其他语言中的null一样的意思。

undefined表示变量值没有初始化,或者这个要查询的值不存在。函数没有返回值的时候也返回undefined。

alert(null == undefined); //true 
alert(null === undefined); //false

全局对象

全局属性:undefined, Infinity, and NaN

全局方法:isNaN(), parseInt() (§3.8.2), and eval() 
构造函数:Date(), RegExp(), String(), Object(), Array()

全局对象:Math,JSON

全局变量作为属性

当定义一个全局变量,其实是在使用全局对象的一个属性。如果使用var声明变量,那么这个属性是不可配置的,意思就是不能通过delete操作删除它。

var c = 0; 
p = 4; //没有使用var 
alert(this.c); 
alert(this.p);

alert(delete c);//false 不可以删除 
alert(delete p);//true 可以删除

alert(c); 删除失败还可以访问

alert(p);不可以访问

var关键字

var定义在函数内部的,那么作用域也就是在函数内部。

var定义在外部的,那么就是全局对象的属性,并且不可被删除。

var定义的变量,如果未初始化,那么他的值就是undefined。

允许多次定义同一个var变量。

function

函数的定义方式

var f1 = function(x) { return x+1; } 
  function f2(x) { return x+1; } 
  var f3 = function f4(x) { return x+2; } //很罕见 
  alert(f1(1));//2 
  alert(f2(1));//2 
  alert(f3(1));//3 
  alert(f4("2"));//"22" 
  f1=f3;//函数类似委托那样赋值。 
  alert(f1(1));//3

try/catch/finally和throw

使用方法和C#中的类似。

  try { 
   // Ask the user to enter a number 
   var n = Number(prompt("Please enter a positive integer", "")); 
   // Compute the factorial of the number, assuming the input is valid 
   var f = factorial(n); 
   // Display the result 
   alert(n + "! = " + f);

   throw ("pppp"); 
  } 
  catch (ex) { // If the user's input was not valid, we end up here 
   alert("error"+ex); // Tell the user what the error is 
  }

Javascript中的一些运算符

instanceof运算符,判断是不是对象的一个实例。

var d = new Date(); // Create a new object with the Date() constructor 
d instanceof Date; // Evaluates to true; d was created with Date() 
d instanceof Object; // Evaluates to true; all objects are instances of Object 
d instanceof Number; // Evaluates to false; d is not a Number object 
var a = [1, 2, 3]; // Create an array with array literal syntax 
a instanceof Array; // Evaluates to true; a is an array 
a instanceof Object; // Evaluates to true; all arrays are objects 
a instanceof RegExp; // Evaluates to false; arrays are not regular expressions

所有的对象都是instances of Object。

eval()演算运算符,转换string到javascript代码,并运行。

eval("function f(x) { return x+1; }"); 
alert(f(2)); //3

typeof运算符,得到type。

x                         typeof x 
undefined         "undefined" 
null                   "object" 
true or false       "boolean" 
any number or NaN     "number" 
any string        "    string" 
any function       "function" 
any nonfunction native object  "object" 
any host object      An implementation-defined string, but not “undefined”, “boolean”, “number”, or “string”.

void运算符

比较特殊,它总是舍弃运算数的值,返回undefined。它的常用方式也就是在客户端javascript中 javascript: URL

<a href="javascript:void window.open();">Open New Window</a>

delete操作符

删除对象属性或者数组元素

var o = { x: 1, y: 2}; // Start with an object 
delete o.x; // Delete one of its properties 
"x" in o // =&gt; false: the property does not exist anymore 
var a = [1,2,3]; // Start with an array 
delete a[2]; // Delete the last element of the array 
a.length // =&gt; 2: array only has two elements now

Javascript中的对象

Javascript的基本数据类型就是object。

一个对象是一组属性的集合, 每个属性都是一对键值对。属性名都是string。

任何不是string,number,布尔,null,undefined的值都是object类型。

javascript的对象是动态属性的,可以被增加或者删除。 
属性可以包含空字符串,但是不能由2个相同的属性。

javascript对象的种类 
本地对象是由ECMAScript定义的类或对象,数组,行数,日期,正则表达式之类的都是本地对象 
宿主对象则是由宿主环境,比如浏览器提供的,其内部内嵌了javascript解释器。

垃圾回收

Javascript解释器实现了自动垃圾回收,程序员不需要考虑内存回收。当一个对象不再可达的时候,解释器知道如何回收它。类似C#中的垃圾回收机制。

Javascript中的对象的创建。

一种就是采用键值对的方式创建。var empty = {}; // An object with no properties 
var point = { x:0, y:0 }; // Two properties 
var point2 = { x:point.x, y:point.y+1 }; // More complex values 
var book = { 
"main title": "JavaScript", // Property names include spaces, 
'sub-title': "The Definitive Guide", // and hyphens, so use string literals 
"for": "all audiences", // for is a reserved word, so quote 
author: { // The value of this property is 
firstname: "David", // itself an object. Note that 
surname: "Flanagan" // these property names are unquoted. 

};

另一种就是采用new

var o = new Object(); // Create an empty object: same as {}. 
var a = new Array(); // Create an empty array: same as []. 
var d = new Date(); // Create a Date object representing the current time 
var r = new RegExp("js"); // Create a RegExp object for pattern matching.

对象中属性的访问方式

对象中属性的访问方式,可以用.访问,也可以用类似数组的方式访问。

alert(book.author.firstname); 
alert(book["author"]["surname"]); 
alert(book["author"].surname);

alert(book["main title"]);

属性的赋值和读取方式,可以采用for的方式。属性可以随时增加或者删除。

var test = {}; 
        for (i = 0; i < 10; i++) { 
            test["shuxing" + i] = i; 
        }

        for (var o in test) { 
            alert(o);//属性名 
            alert(test[o]); 
        }

Javascript中的数组

javascript中数组是对象的特殊形式,继承于rray.prototype。元素个数可以不定,随时增加,元素的类型也随意。

var empty = []; // An array with no elements 
var primes = [2, 3, 5, 7, 11]; // An array with 5 numeric elements 
var misc = [ 1.1, true, "a", ]; // 3 elements of various types + trailing comma

var base = 1024; 
var table = [base, base+1, base+2, base+3];

var b = [[1,{x:1, y:2}], [2, {x:3, y:4}]];

var count = [1,,3]; // An array with 3 elements, the middle one undefined. 
var undefs = [,,]; // An array with 2 elements, both undefined.

增加删除数组元素

a = [] // Start with an empty array. 
a[0] = "zero"; // And add elements to it. 
a[1] = "one";

a = []; // Start with an empty array 
a.push("zero") // Add a value at the end. a = ["zero"] 
a.push("one", "two") // Add two more values. a = ["zero", "one", "two"]

删除元素

a = [1,2,3]; 
delete a[1]; // a now has no element at index 1 
1 in a // => false: no array index 1 is defined 
a.length // =&gt; 3: delete does not affect array length

删除数组元素类似于将undefined值赋给元素,并不改变数组的length属性。

数组的push,pop方法

push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。把指定的值添加到数组后的新长度。 
push() 方法可把它的参数顺序添加到 arrayObject 的尾部。它直接修改 arrayObject,而不是创建一个新的数组。push() 方法和 pop() 方法使用数组提供的先进后出栈的功能。

pop() 方法用于删除并返回数组的最后一个元素。 
pop() 方法将删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值。如果数组已经为空,则 pop() 不改变数组,并返回 undefined 值。

shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。 
如果数组是空的,那么 shift() 方法将不进行任何操作,返回 undefined 值。请注意,该方法不创建新数组,而是直接修改原有的 arrayObject。

unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。

unshift() 方法将把它的参数插入 arrayObject 的头部,并将已经存在的元素顺次地移到较高的下标处,以便留出空间。该方法的第一个参数将成为数组的新元素 0,如果还有第二个参数,它将成为新的元素 1,以此类推。 
请注意,unshift() 方法不创建新的创建,而是直接修改原有的数组。

注释:该方法会改变数组的长度。 
注释:unshift() 方法无法在 Internet Explorer 中正确地工作!

Array 对象方法

方法 描述 FF IE 
concat() 连接两个或更多的数组,并返回结果。 1 4 
join() 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。 1 4 
pop() 删除并返回数组的最后一个元素 1 5.5 
push() 向数组的末尾添加一个或更多元素,并返回新的长度。 1 5.5 
reverse() 颠倒数组中元素的顺序。 1 4 
shift() 删除并返回数组的第一个元素 1 5.5 
slice() 从某个已有的数组返回选定的元素 1 4 
sort() 对数组的元素进行排序 1 4 
splice() 删除元素,并向数组添加新元素。 1 5.5 
toSource() 返回该对象的源代码。 1 - 
toString() 把数组转换为字符串,并返回结果。 1 4 
toLocaleString() 把数组转换为本地数组,并返回结果。 1 4 
unshift() 向数组的开头添加一个或更多元素,并返回新的长度。 1 6 
valueOf() 返回数组对象的原始值 1 4

javascript中的function

javascript中函数是对象,可以由程序操作。可以将function赋值给一个变量,并且传递给另一个函数调用。因此,既然function是对象,你可以为其设置属性,甚至在方法中调用他们,javascript中function可以嵌套function,可以访问在他们生命周期中定义的变量,也就是说javascriptfunction支持闭包的。

函数的定义方式还可以使用Function()构造函数。

例如:

var f = new Function("x", "y", "return x+y;"); 
 alert(f(3, 5));

这种方式和function f(x,y){return x+y;}等价。但是允许你动态的构造函数,而且将定义函数变成定于语句表达式在某些情况下也会更方便。

注意:尽管可以使用 Function 构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢得多。不过,所有函数都应看作 Function 类的实例。

Function 类可以表示开发者定义的任何函数。

javascript 定义类的方式,还是用function关键字

ECMAScript是一种由欧洲计算机制造商协会(ECMA)通过ECMA-262标准化的脚本程序设计语言

ECMAScript 最令人感兴趣的可能莫过于函数实际上是功能完整的对象。

例如:

function f(x, y) { 
            this.X = x; 
            this.Y = y; 
            var pp =10; 
            this.dowork = function () { return this.X + this.Y+pp; }; 
        }

        var s = new f(4, 9);

?    ?    alert(s.X) 
        alert(s.dowork());

当对象被new的时候,this表示这个对象本身,this.X就好比这个X是public的,可以在下面的s中访问到。f(x, y)本身就相当于与对象f的构造函数,s作为f类的实例,可以这么理解。同样的,s对象的属性也可以随时增加或者删除。









本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/716760,如需转载请自行联系原作者



相关文章
|
16天前
|
存储 JavaScript 前端开发
解释 JavaScript 中的作用域和作用域链的概念。
【4月更文挑战第4天】JavaScript作用域定义了变量和函数的可见范围,静态决定于编码时。每个函数作为对象拥有`scope`属性,关联运行期上下文集合。执行上下文在函数执行时创建,定义执行环境,每次调用函数都会生成独特上下文。作用域链是按层级组织的作用域集合,自内向外查找变量。变量查找遵循从当前执行上下文到全局上下文的顺序,若找不到则抛出异常。
20 6
|
2月前
|
JavaScript 前端开发 网络协议
​Node.js 教程(一) 基本概念与基本使用
​Node.js 教程(一) 基本概念与基本使用
|
3月前
|
JavaScript 前端开发 Java
Node.js专题讲解 第1期 概念篇
Node.js专题讲解 第1期 概念篇
23 0
|
3月前
|
JavaScript 前端开发
Node.js中的EventEmitter模块:基本概念、使用方法和常见应用场景
Node.js中的EventEmitter模块:基本概念、使用方法和常见应用场景
61 0
|
4月前
|
自然语言处理 JavaScript 前端开发
作用域的概念及作用?作用域的分类?.js 属于哪种作用域?
作用域的概念及作用?作用域的分类?.js 属于哪种作用域?
33 0
|
4月前
|
前端开发 JavaScript
JavaScript 前端框架相关: React、Vue或Angular中组件化的概念是什么?
JavaScript 前端框架相关: React、Vue或Angular中组件化的概念是什么?
78 3
|
4月前
|
负载均衡 JavaScript 算法
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
41 1
|
1月前
|
移动开发 前端开发 JavaScript
编程笔记 html5&css&js 002 一些基本概念
编程笔记 html5&css&js 002 一些基本概念
|
2月前
|
存储 JavaScript 前端开发
JavaScript基础:了解核心概念和技能
JavaScript基础:了解核心概念和技能
55 1
|
3月前
|
消息中间件 自然语言处理 JavaScript
【面试题】你理解中JS难理解的基本概念是什么?
【面试题】你理解中JS难理解的基本概念是什么?