javaScript基础

【链接】JavaScript快速入门

http://docs.cocos.com/creator/manual/zh/scripting/javascript-primer.html

【链接】JavaScriptString对象

http://www.w3school.com.cn/jsref/jsref_obj_string.asp

【链接】this的值到底是什么?一次说清楚
https://zhuanlan.zhihu.com/p/23804247

1.数据类型与变量

JavaScript中有5种简单数据类型(也称为基本数据类型) :Null、Boolean、Number和String。还有1种复杂数据类
Undef ined.型一0bject,0bject本质上是由一组无序的名值对组成的。
介于JavaScript是松散类型的,因此需要有一种手段来检测给定变量的数据类型一typeof就是负责提供者方面信息的操作符。对一
个值使用typeof操作符可能返回下列某个字符串:
"undefined"-如果这个值未定义;
"boolean"-如果这个值是布尔值;
"string"-如果这个值是字符串;
'number"一如果这个值是数值;
"object"-如果这个值是对象或null

“function”一如果这个值是函数;

2.1

Number类型

这种类型用来表示整数和浮点数值,还有一种特殊的数值,即NaN (非数值Not a Number) 。这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。
NaN本身有两个非同寻常的特点。首先,任何涉及NaN的操作(例如NaN/10)都会返回NaN,这个特点在多步计算中有可能导致问题。
其次,NaN与任何值都不相等,包括NaN本身。例如,下面的代码会返回false。

alert (NaN == NaN) ;//false

console.log(NaN == NaN

2.1.1

JavaScr ipt中有一个i sNaN () 幽数这 个 凼 数接 文一个 参 数 ,垓参数可以使任何类型,而函数会帮我们确定这个参数是否“不是数值”。isNaN() 在接收一个值之后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值,例如字符串”10 “或Boolean值。
任何不能被转换为数值的值都会导致这个函数返回true。例如:
alert(isNaN(NaN)) ;//t rue

alert(isNaN(10)) ;//fa Ise (10是一个数值)
alert(isNaN("10")) ;//false(可能被转换为数值10)

alert(isNaN("blue")) ;//true(不能被转换为数值)

alert(isNaN(true)) ;//fa Ise (可能被转换为数值1)

有3个函数可以把非数值转换为数值: Number ()、parselnt () 和parseFloat()。

第一个函数,即转型函数Number () 可以用于任何数据类型,而另外两个函数则专门用于把字符串转换成数值。这3个函数
对于同样的输入会返回不同的结果。

var num1= Number("Hel lo World") ;//NaN
var num2 = Number ("") ;//0
var num3 = Number ("000011") ;//11
var num4 = Number(true) ;//1
由于Number() 函数在转换字符串时比较复杂而且不够合理,因此parselnt() 函数在转在处理整数的时候更常用的是parseInt() 函数。
换宇符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直至找到第一个非空格字符。如果第一个字符串不是数字字符或者负号,parselnt() 会返回NaN; 也就是说,用parseInt()转换空字符串会返回NaN。如果第一个字符是数字字符,praselnt()会继续解析第二个字符,知道解析完所有后续字符或者遇到了一个非数字
字符。例如,"1234blue"会被转换为1234,”22.5 “会被转换为22,
因为小数点并不是有效的数字字符。
如果宇符串中的第一个字符是数字字符,parselnt()也能够识别出各种整数格式(即十进制、八进制、十六进制)。为了更好的理解parselnt() 函数的转换规则,下面给出一些例子

var num1=parseInt("1234blue") ;//1234
var num2=parseInt("") ;/ /NaN
var num3=parseInt("0xA") ;//10 (十六进制)
var num4=parseInt ("22.5") ;//22
var num5=parseInt(070) ;//56 (八进制)
var num6=parseInt(70) ;//70
var num7=parseInt("10",2) ;//2 (按二进制解析)
var num8=parseInt("10",8) ;//8 (按八进制解析)
var num9=parseInt("10",10) ;//10 (按十进制解析)
var num10 = parseInt ("10",16) ;//16 (按十六进制解析)
var num12 = parseInt ("AF",16) ;//175
与parseInt() 函数类似,parseFloat() 也是从第一个字符(位置0) 开始解析每个宇符。而且也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止。也就是说,宇符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。
22.34.5 “将会被转换成22.34。
例如,
parseFloat() 和parselnt() 的第二个区别在于它始终都会忽略前导的零。由于parseFloat()值解析十进制值,因此它没有用第二个参数指定基数的用法。

var num1=parseFloat ("1234blue") ;//1234
var num2=parseFloat ("OxA") ;//0
var num3=parseFloat ("22.5") ;//22.5
var num4=parseFloat("22.34.5") ;//22.34
var num5= parseFloat ("0908.5") ;//908.5
String类型
String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由单引号(‘)或双引号(")表示。
var str1= "Hello";
var str2 = 'Hello';

任何字符串的长度都可以通过访问其length属性取得//输出5
alert (str1.length) ;
要把一个值转换为一个字符串有两种方式。第一种是使用几乎每个值都有的toString() 方法。

var age=11;
ageAsString = age.toString () ;//字符串"11"
var found=true;
var foundAsString = found.toString () ;//字符串"true"

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

var num=10;

alert (num.toString () );//"10"

alert (num.toString (2) );//"1010"


通过这个例子可以看出,通过指定基数,toString()方法会改变输出的值。而数值10根据基数的不同,可以在输出时被转换为不同
的数值格式。
在不知道要转换的值是不是nul|或undef ined的情况下,还可以使用转型函数String(),这个函数能够将任何类型的值转换为字符串。
String()函数遵循下列转换规则:
如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果
如果值是null,则返回"null"
如果值是undefined,则返回”undefined “
var valuel1=10;
var value2 = true;
var value3=null;
var value4;
alert(String(value1)) ;/ /"10"
alert (String(value2));//"true"
alert(String(value3)) ;//"null"

alert(String(value4)) ;/ /"undefined"




Array类型
在程序语言中数组的重要性不言而喻,JavaScript中数组也是最常使用的对象之一,数组是值的有序集合,由于弱类型的原因,
JavaScript中数组十分灵活、强大,不像是Java等强类型高级语言数组只能存放同一类型或其子类型元素,JavaScript在同一个数组中可以存放多种类型的元素,而且是长度也是可以动态调整的,可以随着数据增加或减少自动对数组长度做更改。

创建数组有两种方式,构造函数以及字面量。下面我们依次介绍一下这两种方式。


构造函数
1.无参构造函数,
创建一空数组
var a1=new Array();
2.一个数字参数构造函数,指定数组长度(由于数组长度可以动态调整,作用并不大),创建指定长度的数组
var a2=new Array(5);
3.带有初始化数据的构造函数,创建数组并初始化参数数据
var a3=new Array(4, 'hello',new Date()) ;
字面量
1.使用方括号,创建空数组,等同于调用无参构造函数
var a4=[];
2.使用中括号,并传入初始化数据,等同于调用调用带有初始化数据的构造函数

var a5=[10];


var a1=new Array(5)//长度为5
console.log(a1.length)
console.log(a1)
运行结果:
5
[ ]
var a2=new Array(5,6)
console.log(a2.length)
console.log(a2)
2

[ 5, 6 ]


var a3=[7]
console.log(a3.length)
console.log(a3)
1

[ 7 ]


var a4=[7,8]
console.log(a4.length)
console.log(a4)
2

[ 7, 8 ]


var a5=[]
console.log(a5.length)
console.log(a5)
0

[]


我们很多时候希望删除中间一个元素后,后面元素的index都自动减一,数组length同时减一,就好像在一个堆栈中拿去的一个,数组已经帮我们做好了这种操作方式,pop和push能够让我们使用堆栈那样先入后出使用数组。


// var a=new Array(1,2,3)
// a.push(4)
// console.log(a)// [ 1, 2, 3, 4 ]
// console.log(a.length)// 4
// console.log(a.pop(a))// 4
// console.log(a)// [ 1, 2, 3 ]
// console.log(a.length)// 3

既然栈方法都实现了,先入先出的队列怎么能少,shift方法可并使后面元素index都减一,length也减以删除数组index最小元素,这样使用shift/push就可以模拟队列了,当然与shift方法对应的有一个unshift方法,用于向数组头部添加一个元素。

// var a=new Array(1,2,3)
// a.unshift(4)
// console.log(a)// [ 4, 1, 2, 3 ]
// console.log(a.length)// 4
// console.log(a.shift(a))// 4
// console.log(a)// [ 1, 2, 3 ]
// console.log(a.length)// 3


// var a=new Array(1,2,3)
// var a2=new Array(2,4,3)


// console.log(a.concat(a2))
// [ 1, 2, 3, 2, 4, 3 ]




继承

下面我们通过一段代码来看一下js中继承的实现。Boy继承自People,同时扩展了自己新的属性。

function Person(name,age)
{
this.name=name;
this.age=age;
}
Person.prototype={
getName:function()
{
return this.name;
},
getAge:function()
{
return this.age;
}
                        }

function Boy(name,age,shape)
{
Person.call(this,name,age);
this.shape=shape;
}
Boy.prototype=Person.prototype;
Boy.prototype.getShape=function()
{
return this.shape;
}
var boy=new Boy("kitty",6,"fat")
 console.log(boy.getName())
  console.log(boy.getShape())
kitty
fat


复制继承,又称对象继承,其实就是复制父对象的属性到子对象身上

几乎所有的 JavaScript 对象都是 Object 的实例;一个典型的对象继承了Object.prototype的属性(包括方法),尽管这些属性可能被遮蔽(也被称为覆盖)。但是有时候可能故意创建不具有典型原型链继承的对象,比如通过Object.create(null)创建的对象,或者通过Object.setPrototypeOf方法改变原型链。

改变Object原型,会通过原型链,而改变所有对象;除非这些属性和方法被其他对原型链更里层的改动所覆盖。这提供了一个非常强大的、但有潜在危险的机制,来覆盖或扩展对象行为。


Object.prototype 属性表示 Object 的原型对象。

Object.prototype.extend100=function (obj)

{



  for (var k in obj) 
  { Javascript中Object对象原型上的hasOwnProperty()用来判断一个属性是定义在对象本身而不是继承自原型链。
    if (obj.hasOwnProperty(k)) 
      {
          if (this[k]==undefined) 
            {
              this[k]=obj[k];
            };
      };
  };
}


var kitty={color:"yellow",climb:function()
{
  console.log("我在树上")
}}
var heihu={color:"yellow and black"}


heihu.extend100(kitty)
console.log(heihu)

heihu.climb()

①、原型冒充的方式来完成继承

function Cat(color)
{
  this.color=color;
  this.climb=function()
  {
    console.log("我在树上")
  }


}
function Tiger()
{
  this.extend=Cat;
  this.extend.apply(this,arguments);
  this.bark=function()
  {
    console.log("吼吼")
  }
  delete this.extend;
}


var heihu=new Tiger("yellow and black")


console.log(heihu.color)
console.log(heihu.extend)
heihu.climb()
运行结果:
yellow and black
undefined
我在树上
5.2:JavaScript函数闭包
闭包是指有权访问另一个函数作用域中的变量的函数,创建闭
包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函
数访问这个函数的局部变量。
闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容
易造成内存泄露。
闭包是javascript语言的一大特点,主要应用闭包场合主要是

为了: 设计私有的方法和变量。

一般函数执行完毕后,局部活动对象就被销毁,内存中仅仅保
存全局作用域。但闭包的情况不同!
闭包有三个特性:
1.函数嵌套函数
2.函数内部可以引用外部的参数和变量
3.参数和变量不会被垃圾回收机制回收

下面图描述了使用闭包保存上一次运行的值。


var aaa=(function(){
  var a=1;
  function bbb()
  {
    a++;
    console.log(a)
  }
  function ccc()
  {
    a++;
    console.log(a)
  }
  return{
    b1:bbb,
    c:ccc
  }


})()
aaa.b1();

aaa.c()

2

3


下面我们深入讲解一下JavaScript中的函数调用。


( function(){..} ) ()和( function (){..} () )是两种
javascript立即执行函数的常见写法,基于此我们需要深入研究一下
下面的知识。

// 1.
// function fun()
// {
//   console.log("HelloWorld")
// }
// fun()
// 2.
// var func=function()
// {
//   console.log("HelloWorld")
// }()


// 3.
// var func=function()
// {
//   console.log("HelloWorld")
// }()


// 4.
// (function(a)
// {
//   console.log(a);
// })("HelloWorld")
// 5.运算符
// (function()
// {
//   console.log("HelloWorld");
// }())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值