草庐IT

JavaScript知识-函数基础知识、匿名函数、闭包函数、箭头函数、js内置对象和方法

橘子甜了吧 2023-03-28 原文

JavaScript函数

1.函数的语法格式

function 函数名(形参1,形参2,形参3....){
    // 函数注释,解释说明该函数用来做什么
    函数体代码
    return 返回值
}

2.无参函数

function func1(){
    console.log('hello world')
}

func1()    // 调用 加括号调用与python中一样

3.有参函数

function func2(a, b){
    console.log(a, b)
}

func2(1,2)    //调用函数(传参)

func2(1,2,3,4,5,6)    // 多了没关系 只要对应得数据
1 2
func2(1)    // 少了也没关系
1 undefined

4.关键字arguments

arguments参数,可以获取传入得所有数据,也支持return和匿名函数
1.能够获取函数接受得索引参数

function func2(a,b){
    console.log(arguments)  // 能够获取函数接受得索引参数
    console.log(a,b)
}


2.关键字arguments(限制函数不能多也不能少)

function func2(a, b){
    if(arguments.length<2){
    console.log('传少了')
    }else if (arguments.length>2){
    console.log('传多了')
    }else{
    console.log('正常执行')
    }
}

5.函数返回值 关键字return

返回元素的个数

function index(){
   return 666, 777, 888
}
res = index();  // 一次只能返回一个值


把返回值做成数组形式返回(可实现多元素返回)

function index(){
    return [666, 777, 888]
}
res = index();


js不支持解压赋值

6.匿名函数(没有函数名)

function(){
console.log('所有只有好好学习)
}
var res = function(){
console.loh('嗯,好好学习把')
}

7.箭头函数

箭头左边的是形参  右边是返回值
var func1 = v => v;

上面等价于下面这句

var func1 = function(v){
   return v
}

var func2 = (arg1,arg2) => arg1+arg2
等价于
var func2 = function(arg1,arg2){
    return arg1+arg2
}

8.函数的全局变量与局部变量

1.局部变量:

在JavaScript函数内部声明的变量(使用var)是局部变量,索引只能在函数内部访问它(该变量的作用域是函数内部)。只要函数运行完毕,本地变量就会被删除

2.全局变量:

在函数外声明的变量是全局变量,网页上的所有脚本和函数都能访问它

3.变量生存周期

JavaScript变量的生命周期从它们被声明的时候开始
局部变量会在函数运行以后被删除
全局变量会在页面关闭后被删除

4.作用域

首先在函数内部查找变量,找不到则到外部函数查找,逐步找到最外层。与python作用域关系查找一模一样

函数全局局部案例:

var city = "BeiJing";
function f() {
  var city = "ShangHai";
  function inner(){
    var city = "ShenZhen";
    console.log(city);
  }
  inner();
}

f();
shenZhen
var city = "BeiJing";
function Bar() {
  console.log(city);
}
function f() {
  var city = "ShangHai";
  return Bar;
}
var ret = f();
ret(); 

Beijing

9.闭包函数

var city = "BeiJing";
function f(){
    var city = "ShangHai";
    function inner(){
        console.log(city);
    }
    return inner;
}
var ret = f();
ret();

ShangHai

10.js内置对象和方法

JavaScript中的所有事物都是对象:字符串、数字、数组、日期,等等。在JavaScript中,对象是拥有属性和方法的数据。
我们在学习基本数据类型的时候已经带大家了解了,JavaScript中的Number对象、String对象、Array对象等。
注意var s1 = "abc"和var s2 = new String("abc")的区别:typeof s1 --> string而 typeof s2 --> Object

类似于python中的内置函数或者内置模块
固定语法
    var 变量名 = new 内置对象名();

1.自定义对象

JavaScript的对象(Object)本质上是键值对的集合(Hash结构),但是只能用字符串作为键。
可以看成是我们python中的字典 但是js中的自定义对象要比python里面的字典操作起来更加方便

2.创建自定义对象{}

var d1 = {'name' : 'jason','age' : 18}

3.第一种方式 创建自定义对象

var d = {'name':'jason','age':18}
typeof d
'object'

d['name']
'jason'

d.name
'jason'

d.age
18

4.支持for循环

ar d = {'name':'jason','age':18}

for(let i in d){
    console.log(i,d[i])
}
VM432:2 name jason
VM432:2 age 18


5.使用new()自定义对象的方式

第二种创建自定义对象的方式 需要使用关键字 new

var d2 = new Object()

d2.name = 'jason'
d2
{name: 'jason'}

d2['age'] = 18
d2
{name: 'jason', age: 18}

Date对象

let d3 = new Date()
Thu Aug 25 2022 20:06:32 GMT+0800 (中国标准时间)

格式化时间

d3.toLocaleString()
'2022/8/25 20:06:32'

也支持自己手动输入时间(自定制)

let d4 = new Date('2022/08/25 12:12:45')
d4
Thu Aug 25 2022 12:12:45 GMT+0800 (中国标准时间)


时间对象方法

var d = new Date();
//getDate()                 获取日
//getDay ()                 获取星期
//getMonth ()               获取月(0-11)
//getFullYear ()            获取完整年份
//getYear ()                获取年
//getHours ()               获取小时
//getMinutes ()             获取分钟
//getSeconds ()             获取秒
//getMilliseconds ()        获取毫秒
//getTime ()                返回累计毫秒数(从1970/1/1午夜)

JSON序列化对象

1.python与js序列化与反序列化

在python中序列化反序列化
	dumps	序列化
	loads	反序列化

在js中也有序列化与反序列化
	JSON.stringify()
	JSON.parse()

2.js序列化使用

let d7 = {'name':'jason','age':18}

序列化
let res = JSON.stringify(d7)
res
'{"name":"jason","age":18}'

反序列化
JSON.parse(res)
{name: 'jason', age: 18}

3.javascript序列化基于网络发送给python

需求:如果当前js中有一个布尔值true需要基于网络发送给python程序并且让python转换成布尔值 如何操作

1.在js中使用JSON.stringify()序列化成json格式字符串
2.基于网络发送给python程序(自动编码)
3.python接收 解码并反序列化

RegExp正则对象

在python中如果需要使用正则 需要借助re模块
在js中需要我们取创建正则对象
1.new代表创建对象
let regl = new RegExp('^[a-zA-Z][a-zA-z0-9]{5,11}')

2.推荐使用
let reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,11}/
匹配内容
reg1.test('woshidashuaibi')
res2.test('woshidashuaibi')

3.获取字符串里面所有的字母s
let sss = 'nish asoswo shi'
sss.match(/s/)  // 拿到一个就停止了

4.解决拿到一个就停止的问题,使用全局匹配/g
sss.match(/s/g)  // 全局模式
(4) ['s', 's', 's', 's']

全局匹配模式:正则表达式的最后不加g则表示匹配成功就结束 加g表示全局匹配,全局匹配会有一个lastindex属性

let reg3 = /^[a-zA-Z][a-zA-Z0-9]{5,11}/g

reg3.test('egondsb')  // 全局模式有一个lastindex属性
true
reg3.test('egondsb')
false
reg3.test('egondsb')
true
reg3.test('egondsb')
false
如果在后面加了一个/g的时候,每一次匹配结束后,它都会等在那里,如果再次校验的时候,它会基于当前页面进行再次向后移动,然后就会报false,报完false以后它会重置走到最开始位置

reg3.test('egondsb')
true
reg3.lastIndex
7
reg3.test('egondsb')
false
reg3.lastIndex
0

let reg4 = /^[a-zA-Z][a-zA-Z0-9]{5,11}/
reg4.test()

reg4.test()  //什么都不传 默认的是undefined
true
reg4.rest()
true

校验时不传参数默认传的是undefined
reg4.test(undefined)
true

有关JavaScript知识-函数基础知识、匿名函数、闭包函数、箭头函数、js内置对象和方法的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  5. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  6. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  7. Ruby 方法() 方法 - 2

    我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

  8. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  9. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  10. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

随机推荐