非零基础学js
前言:
javacript跟java没有丝毫联系,半毛钱关系都没有;而且两种语言的最初的应用场景迥异,语言特性又截然不同,大家不要混为一谈。
如果一定要扯上一些联系,那就打个比方:大家都知道肯德基的汉堡不错,我这里开了个包子铺卖包子,为了增加知名度,打个牌子叫做肯德基包子,当然也没有得到肯德基的任何授权。
事实上也是这么回事,某浏览器厂商让某程序员大牛十天设计出了一个脚本语言,运行在他们的浏览器上,用于产生动态/交互效果;而后为了推广自己的浏览器和这个脚本语言,需要给这个语言起个名字吧,恰好当时java语言正是名气最大的网红,那就借网红个东风吧,姑且叫做javascript。
如今js是真的如日中天,动态语言特性加函数式编程风格,在移动互联网的大环境下,各大互联网公司的推动下,js成为了真正的网红。
说实话,js学习很容易起步,但仅限于一般的编程语言会用的范畴,要想真正走进js的世界,很难。
1 变量与数据类型
1.1 动态数据类型
与C、java等静态语言不同,javascript是一种动态类型语言,即变量的类型不是静态的,而是动态的。
那么什么是静态呢,静态有两个特点
* 变量在定义时就已经固定下类型了,比如 int a;这个语句定义了一个变量a,a是int类型的;变量的类型名字十分确定
* 在程序运行过程中,变量的类型不会发生变化,整型的变量不能变成字符型,其实原因在于静态类型语言下,一旦变量定义了,变量的内存结构也就确定下来了。
相对于静态语言,很容易得出动态语言的特点:
* 变量定义时不必固定类型
* 程序运行过程中,变量的类型可以随时改变
//来个小栗子 js的
var i; //定义了一个变量,使用var关键字,不会指明具体类型
i=1; // i赋值为1,i是 number类型
i=‘ab‘; // 同一个1赋值为‘ab‘字符串,i是string类型,i的类型发生了变化
1.2 js的数据类型种类
// 1 string 字符串
var carname="Volvo XC60";
var carname=‘Volvo XC60‘;
// 2 Number 数字 , 不区分整型和浮点型
var x1=34.00; //使用小数点来写
var x2=34; // //不使用小数点来写
// 3 布尔类型 boolean
var x=true;
var y=false;
// 4 数组 Array
// 4.1 第一种
var cars=new Array();
cars[0]="Saab";
cars[1]="Volvo";
cars[2]="BMW";
// 4.2 注意,不是大括号,而是小括号,数组元素作为参数传入
var cars=new Array("Saab","Volvo","BMW");
// 4.3 json的方式,最常用的方式
var cars=["Saab","Volvo","BMW"];
var bikes=[];//定义了一个空数组
// 5 对象 object
// 其实跟键值对类似 key:value , value可以为任意类型
// json格式
var person={firstname:"John", lastname:"Doe", id:5566};
//如何引用某元素,有两种方式
name=person.lastname;
name=person["lastname"];
// 6 函数 function
function a(){}; //正常定义函数的方式
var b= function(){ }; // 匿名函数引用的方式
// 7 未赋值的类型 undefined
// 8 空值 null,用于清空对象
// null其实也是对象类型
var dd;
var nn = null;
console.log(typeof dd); //undefined
console.log(typeof nn); // object
用于确定类型的操作符是typeof
typeof "John" // 返回 string
typeof 3.14 // 返回 number
typeof NaN // 返回 number
typeof false // 返回 boolean
typeof [1,2,3,4] // 返回 object
typeof {name:‘John‘, age:34} // 返回 object
typeof new Date() // 返回 object
typeof function () {} // 返回 function
typeof myCar // 返回 undefined (if myCar is not declared)
typeof null // 返回 object
事实上,所有数据类型都是对象,因为js是基于对象的
1.3 js是基于对象的
什么是对象
与java的区别
- java是OO语言,Object-Oriented,面向对象的,但其实是基于类的。java中要想有对象,必须先有类,先有个对象的概念模型(形式化描述),然后根据这个模型进行实例化,造出一个具体的对象。一句话就是java是先有类,后有对象
- 而js创建对象则不需要任何模型事先的定义,直接 var a={}就定义了一个a对象,那么a对象有哪些属性呢?可以随时添加
构造器 constructor
构造器 在java中有构造方法的概念,用于初始化对象,js中的对象也有constructor属性,既然js中的变量都是基于对象的,那么每个变量的构造器constructor又是什么呢?
console.log("John".constructor ); // function String() { [native code] }
console.log(1.3.constructor ); // function Number() { [native code] }
console.log(true.constructor ); // function Boolean() { [native code] }
console.log([].constructor ); // function Array() { [native code] }
console.log({}.constructor ); // function Object() { [native code] }
console.log(function(){}.constructor ); // function Function() { [native code] }
JSON数据格式 (进阶学习)
JSON 英文全称 JavaScript Object Notation
js的对象定义的方式,很简洁,很简洁地就描述了一个对象有哪些属性及其内容。在对象描述和程序交互数据时,可以使用xml的方式,而js的这种简洁对象描述也得到程序员的倾慕,于是就出现了一种使用js对象定义的格式的字符串用于描述数据的方式,叫做JSON。
js对JSON的支持体现在【对象】和【JSON文本】之间的转换
* JSON.parse(text) //将text转换为对象
* JSON.stringify(object) // 将object文本化
2 语句
2.1 if语句
凡是程序设计语言都需要有的结构,js同样,没有太大新意,需要注意的就是if(expr)中的expr表达式什么时候是真是假
expr中可以出现各种类型的值,下面分别做出测试
if(0.11) console.log("a"); else console.log("b"); // a
if(1) console.log("a"); else console.log("b"); // a
if(0) console.log("a"); else console.log("b"); // b
if("a") console.log("a"); else console.log("b"); // a
if("") console.log("a"); else console.log("b"); // b
if(‘‘) console.log("a"); else console.log("b"); // b
if(false) console.log("a"); else console.log("b"); //b
if([]) console.log("a"); else console.log("b");//a
if({}) console.log("a"); else console.log("b");//a
if(undefined) console.log("a"); else console.log("b");//b
if(null) console.log("a"); else console.log("b");//b
结论是,数字0、空字符串、null、undefined、布尔false都为假
注:空数组和{}这种对象(只要不是null的对象)也是真的
2.2 for循环
同样只说特殊用法
* for循环可以用于遍历对象属性,for..in..的方式
var car={
color:"white",
type:"jetta",
run:function(){console.log("run run run")}
}
//输出所有属性
for(var x in car)
console.log(x + ": "+car[x]);
/* color: white
type: jetta
run: function (){console.log("run run run")} */
//如果不输出类型为方法的属性,则如下
for(var x in car){
if(typeof(car[x])!=‘function‘)
console.log(x + ": "+car[x]);
}
3 常用内置对象
3.0.1 基本介绍
常用内置对象有Number String Date Array Math RegExp
其中,Math是个对象,其余的都是方法,或者叫做function对象。
console.log(typeof Number);//function
console.log(typeof String);//function
console.log(typeof Array);//function
console.log(typeof Date);//function
console.log(typeof RegExp); //function
console.log(typeof Math); //object
弄懂这点有什么意义呢?
如果是function对象的话,可能就是构造方法,事实上确实如此,Number String Date Array RegExp可以用来作为对象构造器(构造函数)来用,即可以用来生成新的属于该类型的对象
下文介绍的各内置对象,一般会说明两块内容:属性和方法,其中属性一般适用于内置对象,而方法适用于使用对象构造器构造出来的对象
3.0.2 prototype 原型属性
原型对象有点类似于java中类的概念,当使用对象的prototype属性进行增加对象属性或方法时,会作用于所有的该原型的对象
var i = new Number(18);
var j = new Number(19);
console.log(i["a"]);
console.log(j["a"]);
Number.prototype.a = "hello";
console.log(i["a"]);
console.log(j["a"]);
//error ******
i.prototype.a = "hello" ;//Uncaught TypeError: Cannot set property ‘a‘ of undefined
事实上,prototype这个属性适用于所有的对象构造器,比如
function foo(a){
this.a=a
}
var a = new foo("c");
foo.prototype.b="dd";
console.log(a.b);
3.1 Number对象
3.1.1 数字类型和数字对象
数字类型和数字对象的区别,与java中int与Integer的区别有些类似
var x = 123;
var y = new Number(123);
typeof(x) // returns Number
typeof(y) // returns Object
3.1.2 Number对象(function对象)的属性
- NaN 用于表示非数值
- MAX_VALUE 可表示最大的值
- MIN_VALUE
- constructor 生成Number对象的方法
- prototype 用于给Number构造的对象添加属性和方法的对象
3.1.3 Number构造的对象的方法
- toFixed(x) 转换成带有x小数的字符串
- toPrecition(x) 转换成x长度(不包含小数点)的字符串
- toString(x) 转换成x进制的字符串 相当好用
- valueOf() 转换成number类型
3.2 String对象
3.2.0 string类型与String对象
这两个在js中做过特殊处理,方法可以通用
3.2.1 对象属性 length 长度
3.2.2 对象方法
- 字符串内查找
charAt indexOf lastIndexOf search(可用regexp) match(匹配)
//没有注释上结果,懒得写了 , match很重要
var str="hello world world";
console.log(str.charAt(1));
console.log(str.indexOf("wo"));
console.log(str.lastIndexOf("wo"));
console.log(str.search(/wo/)); //6
var ma = str.match(/wo/g);
console.log(typeof ma);
console.log(ma.length);
console.log(ma);
- 替换
replace 两个需要注意的地方:1)可以用正则表达式 2)不会更改原始字符串
var str="hello world world";
var cc = str.replace(/world/,"cc");
var dd = str.replace(/world/g,"dd");
console.log(str); // hello world world
console.log(cc); // hello cc world
console.log(dd); //hello dd dd
- 获取子串
slice ~ substring , substr(start,len)
var str="hello world";
console.log(str.slice(1,3)); // el
console.log(str.substr(1,3)); // ell
console.log(str.substring(1,3));//el
console.log(str.slice(1)); // ello world
console.log(str.substr(1)); // ello world
console.log(str.substring(1));//ello world
console.log(str.slice(-1)); // d
console.log(str.substr(-1)); // d
console.log(str.substring(-1));//hello world
console.log(str.slice(-1,3)); // ""
console.log(str.substr(-1,3)); // d
console.log(str.substring(-1,3));//hel
*大小写转换
toLowerCase toUpperCase 注:不会改变原字符串
var str="hello WORLD";
var lower = str.toLowerCase();
var upper = str.toUpperCase();
console.log(str);
console.log(lower);
console.log(upper);
3.3 Date对象
3.1 创建对象
- new Date() // 当前日期和时间
- new Date(milliseconds) //返回从 1970 年 1 月 1 日至今的毫秒数
- new Date(dateString)
- new Date(year, month, day, hours, minutes, seconds, milliseconds)
3.2 主要方法
注意:getDay getMonth获得的是从0开始的
方法 | 说明 |
---|---|
getDate() | 从 Date 对象返回一个月中的某一天 (1 ~ 31)。 |
getDay() | 从 Date 对象返回一周中的某一天 (0 ~ 6) 第一天是周日sunday。 |
getFullYear() | 从 Date 对象以四位数字返回年份。 |
getHours() | 返回 Date 对象的小时 (0 ~ 23)。 |
getMilliseconds() | 返回 Date 对象的毫秒(0 ~ 999)。 |
getMinutes() | 返回 Date 对象的分钟 (0 ~ 59)。 |
getMonth() | 从 Date 对象返回月份 (0 ~ 11)。 |
getSeconds() | 返回 Date 对象的秒数 (0 ~ 59)。 |
getTime() | 返回 1970 年 1 月 1 日至今的毫秒数。 |
3.4 Array对象
- Array对象与[]数组类型的方法通用
主要方法
- 查找子元素
indexOf lastIndexOf
var arr=[‘a‘,‘b‘,‘a‘];
console.log(arr.indexOf(‘a‘));//0
console.log(arr.lastIndexOf(‘a‘));//2
- join数组元素串联,形成大的字符串
var arr=[‘a‘,‘b‘,‘a‘];
console.log(arr.join()); //a,b,a
console.log(arr.join("-"));//a-b-a
- 改变数组内容
- push append ,return length
- pop return last ,delete
- shift return first,delete
- unshift insert at first, return len
- splice return (index,len),delete, add
var arr=[‘a‘,‘b‘,‘c‘];
console.log(arr.push(‘d‘));//4
console.log(arr); // a,b,c,d
console.log(arr.pop()); // d
console.log(arr);//a,b,c
console.log(arr.shift());//a
console.log(arr);//b,c
console.log(arr.splice(1,1,"e","f"));//c
console.log(arr);//b,e,f
console.log(arr.unshift("g"));//4
console.log(arr);//g,b,e,f
- sort排序 reverse反转顺序
var arr=[‘a‘,‘b‘,‘a‘];
console.log(arr.sort()); //a,a,b
console.log(arr.reverse());//b,a,a
- every,some 对数组元素是否满足条件进行判断
var arr=[‘a‘,‘b‘,‘a‘];
function hasA(e){
return e==‘a‘;
}
console.log(arr.every(hasA)); // false
console.log(arr.some(hasA)); //true
- filter 过滤元素,生成新数组
var arr=[‘a‘,‘b‘,‘a‘];
function isA(e){
return e==‘a‘;
}
console.log(arr.filter(isA).length)
console.log(arr.filter(isA))
- map 对每个元素处理,并生成新的数组
var arr=[‘a‘,‘b‘,‘c‘];
function wrap(a){
return "<h1>"+a+"</h1>";
}
console.log(arr.map(wrap));
console.log(arr);
3.5 RegExp对象
3.5.1 创建正则表达式对象
- var patt=new RegExp(pattern,modifiers);
- var patt=/pattern/modifiers; 简单方式
3.5.1.1 修饰符
- i 忽略大小写
- g 全局匹配
3.5.1.2 范围内字符
表达方式 | 内容 |
---|---|
[abc] | 查找方括号之间的任何字符。 |
[^abc] | 查找任何不在方括号之间的字符。 |
[0-9] | 查找任何从 0 至 9 的数字。 |
[a-z] | 查找任何从小写 a 到小写 z 的字符。 |
[A-Z] | 查找任何从大写 A 到大写 Z 的字符。 |
[A-z] | 查找任何从大写 A 到小写 z 的字符。 |
[adgk] | 查找给定集合内的任何字符。 |
[^adgk] | 查找给定集合外的任何字符。 |
(red | blue |
3.5.1.3 元字符
表达方式 | 内容 |
---|---|
. | 查找单个字符,除了换行和行结束符。 |
\w | 查找单词字符。 |
\W | 查找非单词字符。 |
\d | 查找数字。 |
\D | 查找非数字字符。 |
\s | 查找空白字符。 |
\S | 查找非空白字符。 |
3.5.1.4 量词
表达方式 | 内容 |
---|---|
n+ | 匹配任何包含至少一个 n 的字符串。 |
n* | 匹配任何包含零个或多个 n 的字符串。 |
n? | 匹配任何包含零个或一个 n 的字符串。 |
n{X} | 匹配包含 X 个 n 的序列的字符串。 |
n{X,Y} | 匹配包含 X 或 Y 个 n 的序列的字符串。 |
n{X,} | 匹配包含至少 X 个 n 的序列的字符串。 |
n$ | 匹配任何结尾为 n 的字符串。 |
^n | 匹配任何开头为 n 的字符串。 |
3.5.2 正则表达式对象的方法
- exec 检索
- test 测试是否存在
var str = "word o WORD";
var reg = /WO\w*/ig;
console.log(reg.exec(str)); //wo
console.log(reg.test(str)); //true
3.5.3 字符串中支持regexpr的方法
表达方式 | 内容 |
---|---|
search | 检索与正则表达式相匹配的值。 |
match | 找到一个或多个正则表达式的匹配。 |
replace | 替换与正则表达式匹配的子串。 |
split | 把字符串分割为字符串数组。 |
杂项
- js是大小写敏感的,跟C、java类似,即变量a与变量A不一样
- js中语句后面的分号是可以省略的。
- > 但强烈建议不要省略,因为编译器会悄悄地把分号加进来,有时候编译器程序并没有那么智能,可能自动添加的分号破坏程序逻辑。
- var是用于声明(定义)变量的关键字,将变量声明到当前作用域中;如果不用var,则变量自动成为全局变量 《- 这点十分重要,可惜有道笔记的markdown语法不支持颜色
- 关系运算==,会自动进行类型转换,比如 5==’5’的结果是true
- 关系运算===,进行“绝对等于”,比如5===’5’会先对比类型,结果是false