JavaScript

1.js事件和作用域

js事件:html页面中每一个元素都可以产生某些触发js函数的事件。这些事件是可以被js侦测到的一种行为,并且js程序能应对这些事件。

常见的html事件

onchange:html元素改变

onclick:用户点击html元素

onmouseover:用户吧鼠标移到html元素上

onmouseout:用户从html元素移开鼠标

onkeydown:用户按下键盘按键

onkeyup:浏览器完成页面的加载

HTML页面完成加载

HTML输入字段被用户更改

HTML按钮被用户点击

设置元素的js事件:行内方法

<element event="JavaScript 代码"></element>
<element event='JavaScript 代码'></element>
<button onclick="getElementById('demo').innerHTML=Date()">

innerHTML属性设置元素的内容

设置元素的事件:内部方法

 <button onclick="displayDate()">点击这里 p 标签的内容将被修改</button>
<script>
function displayDate() {
document.getElementById("demo").innerHTML = Date();
}
</script>

js作用域

js中有全局作用域和局部作用域

局部作用域:在函数内声明的变量为局部变量,作用域只在函数内部有效,也只能被函数内部访问。 不同函数中可以声明同名的局部变量,局部变量的生命周期是函数的生命周期。

<script>
myFtn(); function myFtn() {
var lanqiaoxueyuan = "www.lanqiao.cn";
document.getElementById("demo1").innerHTML =
"lanqiaoxueyuan" + " = " + lanqiaoxueyuan;
}
document.getElementById("demo2").innerHTML = typeof lanqiaoxueyuan;//undefined
</script>

全局作用域:在函数外声明的变量。全局变量作用域针对整个全局。网页的所有脚本和函数都能访问它。

<script>
var lanqiaoxueyuan = "www.lanqiao.cn";
myFtn();

function myFtn() {
document.getElementById("demo").innerHTML =
"我能显示 " + lanqiaoxueyuan;
}
</script>

自动全局:如果变量在函数内没有声明(没有使用var关键字),该变量为全局变量。

<script>
myFtn();

// 此处的代码可以把 lanqiaoxueyuan 作为全局变量使用。
document.getElementById("demo").innerHTML =
"我可以显示 " + lanqiaoxueyuan;//没有声明直接使用

function myFtn() {
lanqiaoxueyuan = "www.lanqiao.cn";
}
</script>

js变量生命周期

js变量在声明时开始初始化,局部变量在函数销毁后自动销毁,全局变量在页面关闭后进行销毁

函数参数:只在函数内部起作用,是局部变量

全局变量:window是全局对象,因此任何全局变量都属于window对象,是它的一个属性。

如果没有特殊需求,不要创建全局变量,因为它会覆盖window变量(或函数),任何函数,包括window对象,能覆盖全局变量和函数。

2.js字符串和运算符

js字符串:单引号或者双引号引起来的unicode字符序列。用于存储和操作文本。

str.length

转移符号

通常,js字符串是原始数据,可以使用字符创建。

var lanqiaoxueyuan = "www.lanqiao.cn";

但也可以使用new关键字将字符串定义为一个对象。

var lanqiaoxueyuan = new String("www.lanqiao.cn");

虽然String对象可以创建,但是它会拖慢执行速度,并可能产生其他副作用。

因为字符串与对象、对象与对象无法比较。

js运算符:算术运算符 + - * / % ++(左、右) --(左、右)

赋值运算符: = += -= *= /= %=

字符串+数字、字符串+字符串

3.js的数据类型转换

js六种可包含值的数据类型:

  • 字符串String

  • 数字Number

  • 布尔Boolean

  • 对象Object

  • 函数function

  • 唯一的symbol

三中对象类型:

  • 对象Object

  • 日期Date

  • 数组Array

两种值唯一的数据类型:

  • null

  • undefined

使用typeof运算符返回变量、对象、表达式的类型

NaN的数据类型是Number

数组Array的数据类型是Object

日期Date的数据类型是Object

null的数据类型是Object

undefined的数据类型是undefined

undefined是null的一种,undefined == null为true

constructor属性用于返回js变量的构造函数

<script>
document.getElementById("demo").innerHTML =
"JACK".constructor +//String()
"<br>" +
(3.14).constructor +//Number()
"<br>" +
false.constructor +//Boolean()
"<br>" +
[1, 2, 3, 4, 5].constructor +//Array()
"<br>" +
{ name: "JACK", age: 36 }.constructor +//Object()
"<br>" +
new Date().constructor +//Date()
"<br>" +
function () {}.constructor;//Function()
</script>

可以通过constructor属性来确定某个对象是否为数组或日期(如果用typeof,都是object)

 <script>
var haha = ["Women", "Meitian", "Douyao", "Kaixin"];
document.getElementById("demo").innerHTML = isArray(haha);
function isArray(myArray) {
return myArray.constructor.toString().indexOf("Array") > -1;
}
</script>

js类型转换

js类型转换有两种方式:使用js函数、js自身自动转换

数字转字符串:全局String()方法、number.toString()

布尔值转字符串:全局String()方法、boolean.toString()

日期转字符串:Date()返回字符串、String()

字符串转数字:

全局Number():

字符串为数值,可以转换成数字、空字符串转换为0、其他字符串转换为NaN(非数值类型)

Number("3.14"); // 返回 3.14
Number(" "); // 返回 0
Number(""); // 返回 0
Number("99 88"); // 返回 NaN

一元运算符+:

        var a = "6";//String
var b = +a;//Number
document.getElementById("demo").innerHTML =
typeof a + "<br>" + typeof b;

使用+可以String转换为Number,如果转换不成功会变成NaN

布尔值转数字:false为0 true为1

全局Number()方法

日期转数字:转换为毫秒数

全局Number()方法,等同于d.getTime()

自动类型转换:

console.log(5 + null);//5 null转为0
console.log("5" + null);//5null null转为“null”
console.log("5" + 1);//51 1转为“1”
console.log("5" - 1);//4 “5”转为5

自动转为字符串:

当尝试输出一个对象或变量时,会自动调用变量的toString()方法

布尔值与字符串:“” “ ”为false 有值的字符串为true

NaN为false +-Infinity为true

“”为数字0

[]为数字0,“”,true

[20]为数字20,"20",true

function(){}为NaN,true

null为数字0,false

undefined为NaN,false

4.js的正则表达式

js的regex语法:/pattern/modifiers

var patt = /lanqiaoxueyuan/i;

js的正则表达式经常使用两个字符串方法:

search():返回匹配的位置

replace():返回模式被替换出修改后的字符串

test():解析字符串,如果符合正则表达式返回true,否则返回false

 var str = "Search lanqiaoxueyuan";
var a = str.search(/lanqiaoxueyuan/i);//7
var str = document.getElementById("demo").innerHTML;
var txt = str.replace(/lanqiaoxueyuan/i, "www.lanqiao.cn");
var a = new RegExp("f");
a.test(
"Attitude determines life, and should not let life determine your attitude!"
);
var patt1 = new RegExp("f");
patt1.exec(
"Attitude determines life, and should not let life determine your attitude!"
);

regex修饰符:

i 执行对大小写不敏感的匹配

g 执行全局匹配

m 执行多行匹配

regex常用模式:

[abc]  a/b/c 
[0-9]  0-9 

(x|y):以|分割的选项

\d:数字

\w:数字、字母、下划线

\b:单词边界

\uxxxx:Unicode(16进制)

\s:空白字符

量词:

n+ 至少一个n

n* 任意n

n? 零个或一个n

5.原型

js中给函数提供了一个对象类型的属性,叫做Prototype(原型)

原型归所有函数所有,他不用创建 是默认存在存在的

function Car(){

}
var c1 = new Car();
var c2 = new Car();
Car.prototype.name = "BMW";
console.log(c1.name);
console.log(c2.name);

js提供了这样的一种机制,如果是通过构造函数创建对象,当访问你的属性在对象中没有找到,则去创建对象的构造函数中找,如果能找到,也相当于对象拥有这个属性

原型的作用就是为类(函数)提供了一个公共区域,在这个公共区域声明的属性和方法能够被所有通过这个类创建的对象所访问到。

function Car(name,speed,ability){
this.name = name;
this.speed = speed;
this.ability = ability;
}
Car.prototype.showAbility= function(){
console.log(this.ability);
}
var c1 = new Car("BMW",240,"坐宝马");
var c2 = new Car("BZ",300,"开奔驰");
c1.showAbility();
c2.showAbility();

原型是js为所有函数所创建的一个对象类型的属性,原型当中的属性和方法被所有的通过这个函数所创建的所有对象共享。

结构: 原型是一个对象,在原型中通常拥有两个属性

1 构造器: constructor 该属性指向这个函数本身

2 原型指向

__proto__该属性指向原型本身,提供给通过类创建的对象使用

作用: 原型用来创建类的共有属性和共有方法,为创建对象服务

优点: 节约内存空间,不必为每一个对象分配共有属性和共有方法的内存

缺点: 原型中不能保存数组这类引用类型的数据,因为地址的传递的问题 会导致出现修改的连锁变换。

6.原型链

构造函数的属性prototype可以设置共有属性和共有方法 对象拥有proto和constructor属性,但是函数也是一种对象,所以函数也有这两种属性 proto是由一个对象指向一个对象,即指向他们的原型对象(父对象)。proto 的作用是,当对象找一个属性没找到时,就去它的父对象里找,再往父对象的父对象里找。最后形成了一条原型链。 prototype是函数独有的,从一个函数指向一个对象,也就是这个函数创建的实例的原型对象,即f1.proto===Foo().prototype。prototype属性的作用是包含可以让特定类型的所有实例共享的属性和方法。 constructor是对象独有的,从一个对象指向一个函数,含义就是指向该对象的构造函数。每个对象都有构造函数,Function的构造函数就是它自己。所以constructor的重点就是Function这个函数。

  
    console.log(c1.__proto__);//获取到c1的构造函数的原型
console.log(c1.__proto__===Car.prototype);//Car.prototype,true
console.log(c1.__proto__.__proto__);//获取到对象的原型,所有对象的原型即Object()定义的公共属性和方法
console.log(c1.__proto__.__proto__===Object.prototype);//Object.prototype,true
console.log(c1.__proto__.__proto__.__proto__);//Object.prototype没有公共属性
console.log(c1.__proto__.__proto__.__proto__);
console.log(new Object().__proto__);//object对象.__proto__===Object()的原型
console.log(new Object().constructor.prototype);//Object()的原型
console.log(new Object().__proto__.__proto__);
console.log(Object.prototype.constructor.prototype);//如果一直对Object对象调用构造方法再获取公共属性,会一直套娃。

22javascript笔记(2)的更多相关文章

  1. git-简单流程(学习笔记)

    这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...

  2. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  3. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  4. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  5. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  6. NET Core-学习笔记(三)

    这里将要和大家分享的是学习总结第三篇:首先感慨一下这周跟随netcore官网学习是遇到的一些问题: a.官网的英文版教程使用的部分nuget包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列 ...

  7. springMVC学习笔记--知识点总结1

    以下是学习springmvc框架时的笔记整理: 结果跳转方式 1.设置ModelAndView,根据view的名称,和视图渲染器跳转到指定的页面. 比如jsp的视图渲染器是如下配置的: <!-- ...

  8. 读书笔记汇总 - SQL必知必会(第4版)

    本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...

  9. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

随机推荐

  1. Spring源码编译一次性通过&遇到的坑解决方法

    前言 spring源码本地编译,按网上的博客参考资料的操作步骤,总是会出现各种莫名其妙的错误.根据错误信息找解决方案,但在自己的环境下又总是编译不过去.结合参加培训学习Jack老师提供的方法,自己多种 ...

  2. linux 开机自启动的两种方式

    方法 1 – 使用 rc.local sudo vi /etc/rc.local 在文件最后加上: sh /root/script.sh & 如果是 CentOS,我们修改的是文件 /etc/ ...

  3. HMM实现中文分词

    链接:https://pan.baidu.com/s/1uBjLC61xm4tQ9raDa_M1wQ  提取码:f7l1 推荐:https://blog.csdn.net/longgb123/arti ...

  4. Java 内存泄漏知多少?

    先看再点赞,给自己一点思考的时间,如果对自己有帮助,微信搜索[程序职场]关注这个执着的职场程序员.我有什么:职场规划指导,技能提升方法,讲不完的职场故事,个人成长经验. 面试的时候内存管理是不是很多面 ...

  5. Activiti7 与 Spring Boot 及 Spring Security 整合 踩坑记录

    1.  前言 实话实说,网上关于Activiti的教程千篇一律,有参考价值的不多.很多都是老早以前写的,基本都是直接照搬官方提供的示例,要么就是用单元测试跑一下,要么排除Spring Security ...

  6. Django基础-004 上下文管理器&中间件&前端公共代码复用

    一.上下文管理器 在views中重复使用的代码,可以在上下文管理器中实现 上下文管理器的处理流程如下: 1.先走完views里面的代码,将结果返回给前端 2.然后再将上下文的结果返回给前端 3.上下文 ...

  7. 使用 VSCode 搭建 Flutter环境

    概述 编辑器使用 vscode,不再安装 Android Studio. 安装 Git 点击这里 下载并安装 Git 配置 Java 环境 下载和安装 JDK 点击下载 Java SE Develop ...

  8. final修饰符(5)-final方法

    final修饰的类的方法不能被重写,例如如果父类不希望子类重写某个方法,则可以使用final修饰符修饰该方法 在java的Object类里面有一个final方法:getClass(),因为Java不希 ...

  9. SLAM的数学基础(3):几种常见的概率分布的实现及验证。

    分布,在计算机学科里一般是指概率分布,是概率论的基本概念之一.分布反映的是随机或某个系统中的某个变量,它的取值的范围和规律. 常见的分布有:二项分布.泊松分布.正态分布.指数分布等,下面对它们进行一一 ...

  10. 自动执行文件夹中的py文件

    写一个函数,接收一个地址,执行其中的py文件,包括子文件.path.endswith('.py') 判断以'.py'结尾,是什么类型的文件.os.system('python %s'%path) 模拟 ...