您的位置:澳门新葡萄京娱乐网站 > web前端 > JavaScript门道之标准库【澳门新葡萄京888官网】

JavaScript门道之标准库【澳门新葡萄京888官网】

2019-12-22 07:02

澳门新葡萄京888官网 1

1.什么是标准库(Standard Library)

标准库指的是js的标准内置对象,是js这门语言本身初始时提供的在全局范围的对象

  • 可以提供参数给对yield的调用:参数会传递到block中,在block中,竖线(|)之间给出参数名来接受这些来自yield的参数。

RubyJS是一个基于JavaScript的Ruby库,使用JavaScript实现了Ruby中的所有方法,如Array、Numbers、Time等。在官网介绍中,Ruby之父松本行弘这样写道:引用If I had to code JavaScript I would use RubyJS.RubyJS主要特点如下:100%使用JavaScript:RubyJS基于JavaScript构建,可以在所有浏览器上运行,无需额外的工具。像Ruby一样工作:你可以轻松将代码从Ruby移植到JavaScript,完全符合rubyspec。快且小:压缩版本仅20K,比同类库更快。实用的“传送带”或OO:RubyJS就像一条实用的“传送带”,将数组、字符串转换为本地对象。或者可以使用成熟的RubyJS对象,并利用它们的mutator方法。集所有功能于一身的库:String、Array、Time、Numbers、Range等。RubyJS提供了多个强大的第三方库,有一个一致的API。Ruby功能:块参数、destructive方法、duck-typing、特殊变量、混入等。RubyJS作者称,开发RubyJS的主要目的是为了有一个JavaScript版的Ruby标准库,而不是使用JavaScript重写Ruby。RubyJS还无法实现Ruby中的类、对象和元编程特性。项目主页:

7.Math对象及其实例

Math对象提供一些数学方面的属性和方法,但Math对象不能创建实例对象

  • Math对象的属性
Math.E
Math.LN2
Math.LN10
Math.PI
Math.SQRT2
  • Math对象的方法
1.Math.abs()
Math.abs(-9)//9
2.Math.max() & Math.min()
Math.max(-1,1,6)//6
Math.min(-1,1,6)//-1
3.Math.pow()
Math.pow(2,3)//8
4.Math.exp()
Math.exp(2)//7.3890560989306495
5.Math.sqrt()
Math.sqrt(3)//1.7320508075688772
6.Math.log()
返回以e为底的自然对数值
Math.log(Math.E)//1
7.Math.ceil() & Math.floor()
Math.ceil:接受一个参数,返回大于该参数的最小整数
Math.floor:接受一个参数,返回小于该参数的最大整数
Math.ceil(1.1)//2
Math.floor(1.1)//1
8.Math.round()
用于四舍五入
Math.round(0.1)//0
Math.round(0.5)//1
Math.round(-1.5)//-1
Math.round(-1.6)//2
9.Math.random()
返回0到1之间的一个伪随机数,可能等于0,但是一定小于1
Math.random()*50 50//[50,100)之间的随机数
10.三角函数方法
略
11.valueOf() & toString()
valueOf()返回Math对象的原始值
toString()返回Math的对象类型
def each
    for each element  # 无效的Ruby语句 
      yield(element)  
    end
end

4.String对象及其实例

String对象是字符串的包装对象,利用String()构造函数创建一个String对象的实例

  • String对象的属性和方法
1.length属性
返回字符串长度
var str = "111"
str.length//3

1.String()本身作为方法
能够将其他类型值转换为字符串
String(1)//"1"
String(true)//"true"
String([1,2,3])//"1,2,3"
String([])//""
String({name:"teren"})//"[object Object]"
2.charAt()
返回指定位置的字符
var str = "123"
str.charAt(2)//"3"
3.charCodeAt()
返回在指定的位置的字符的 Unicode 编码
str.charCodeAt(0)//49
4.indextOf()
返回字符所在的位置
str.indexOf(1)//0
5.substring()
提取字符串中两个指定的索引号之间的字符
var str = "NBA Basketball "
str.substring(1,3)//"BA"
str.substring(1,5)//"BA B"
6.toUpperCase()&toLowerCase()
var str ="hello"
str.toUpperCase()//"HELLO"
var strr = "HELLO"
strr.toLowerCase()//"hello"
7.trim()
删除空格
var s = "      str"
s//"      str"
s.trim()//"str"
8.split()
把字符串分割为字符串数组
var s = "hello"
s.split("")//["h", "e", "l", "l", "o"]
var str = "hello world"
str.split(" ")//["hello", "world"]
9.slice(1,5)
从下标为1开始(包含元素)至下标5(不包含)
var str = "helloworld"
str.slice(1,5)//"ello"
10.valueOf()&toString()
都是返回字符串
  • String对象实例的属性和方法
var str = new String("hello world");
//字面量
var str = "hello world"

【注】
String对象实例的属性和方法基本包含在String对象的属性与方法中

4.Boolean对象及其实例
Boolean对象是布尔值的包装对象,利用Boolean构造函数创建一个布尔对象

var a = true;
typeof a//"boolean"
var b = new Boolean (true)
typeof b//"object"

【注】
不鼓励使用Boolean()构造布尔对象

看看(puts "In the block")block中的代码块如何被执行两次,每次调用yield时,代码都会被执行。

8.Date对象

Date对象是JavaScript提供的日期和时间的操作接口

  • Date实例对象的参数
    Date对象的起始时间为1970年1月1日00:00:00 UTC
new Date()//Tue Jun 21 2016 21:45:31 GMT 0800 (中国标准时间)
new Date(1000)//Thu Jan 01 1970 08:00:01 GMT 0800 (中国标准时间)
new Date(3600*24*1000)//Fri Jan 02 1970 08:00:00 GMT 0800 (中国标准时间)
new Date("March 5,2015")//Thu Mar 05 2015 00:00:00 GMT 0800 (中国标准时间)
new Date("2015/5/5")//Tue May 05 2015 00:00:00 GMT 0800 (中国标准时间)
new Date(2014,1,1,23,59,23,999)//Sat Feb 01 2014 23:59:23 GMT 0800 (中国标准时间)
  • Date对象的方法
1.Date()本身作为方法
var today = new Date()
2.Date.now()
返回当前距离1970年1月1日 00:00:00 UTC的毫秒数
Date.now()//1466517135730
3.Date.parse()
用来解析日期字符串,返回距离1970年1月1日 00:00:00的毫秒数
Date.parse(2015,2,2)//1420070400000
4.Date.UTC()
返回当前距离1970年1月1日 00:00:00 UTC的毫秒数
Date.UTC(2000,0,1)//946684800000
  • Date对象实例的方法
1.to类:返回关于时间和日期的字符串
toString():返回一个完整的日期字符串
var d = new Date(2000,0,1)
d.toString()//"Sat Jan 01 2000 00:00:00 GMT 0800 (中国标准时间)"
--
toUTCString():返回对应的UTC时间
var d = new Date()
d//Tue Jun 21 2016 22:00:06 GMT 0800 (中国标准时间)
d.toUTCString()//"Tue, 21 Jun 2016 14:00:06 GMT"
--
toDateString():返回日期字符串
d.toDateString()//"Tue Jun 21 2016"
--
toTimeString():返回时间字符串
d.toTimeString()//"22:00:06 GMT 0800 (中国标准时间)"

2.get类:获取关于时间和日期的值
getTime():返回距离1970年1月1日00:00:00的毫秒数
var d = new Date(2000,0,1)
d//Sat Jan 01 2000 00:00:00 GMT 0800 (中国标准时间)
d.getTime()//946656000000
--
getDate():返回实例对象对应每个月的几号
d.getDate()//1
--
getDay():返回星期几
d.getDay()//6
--
getFullYear():返回四位的年份
d.getFullYear()//2000
--
getMonth() & getHours() & getMinutes & getSeconds & getMilliseconds
d.getHours()//0
d.getMinutes()//0
d.getSeconds()//0
d.getMilliseconds()//0

3.set类:设置实例对象的时间和日期
var d = new Date(2000,0,1)
d.setDate(20)//948297600000
d//Thu Jan 20 2000 00:00:00 GMT 0800 (中国标准时间)
--
setFullYear()
d.setFullYear(2005)//1106150400000
d//Thu Jan 20 2005 00:00:00 GMT 0800 (中国标准时间)
--
setMonths & setHours & setMinutes  & setSeconds & setMiliseconds效果同上

【注】
关于jsDate对象的时间和日期的取值范围

分钟和秒:0 到 59
小时:0 到 23
星期:0(星期天)到 6(星期六)
日期:1 到 31
月份:0(一月)到 11(十二月)
年份:距离1900年的年数

  • 本节简单描述Ruby的一个独特特性,Block,一种可以和方法调用相关联的代码块,几乎和参数一样,这是一个不可思议的强大的特性。一位评论家说:这个特性是相当有趣和重要,如果以前没有注意到,从现在开始你应该注意了。

  • 可以用Block实现回调(但它比Java的匿名内部(anonymous inner)类更简单),传递一组代码(但它远比C的函数指针更灵活),以及实现迭代器。

  • Block 只是花括号或者do...end之间的一组代码

2.Object对象及其实例

JavaScript原生提供一个Object对象,所有的其他对象均继承自这一对象

  • Object对象的属性和方法
    利用console.dir(Object)查找Object对象的属性和方法

澳门新葡萄京888官网 2

常用的属性或方法简介:
1.prototype对象

prototype是Object对象下的原型对象,
原型对象里面用于放置其他继承自Object对象的属性和方法,例如:
Object.prototype.valueOf()
Object.prototype.toString()
两个方法都是部署在Object对象下的prototype原型对象,
而其他对象如Number对象、String对象
或是自定义对象var a = new Object()都可以继承prototype的属性和方法

2.Object.keys(object)

keys()方法输入一个实例对象并返回对象的属性数组

澳门新葡萄京888官网 3

3.Object.getOwnPropertyNames

澳门新葡萄京888官网 4

【注】keys方法只返回可枚举的属性,getOwnPropertyNames还返回不可枚举的属性名。

4.Object()本身作为方法使用

var a = {name:"teren"}
Object(a)
//传入一个对象实例返回该实例
Object {name: "teren"}

//传入一个原始类型值,则返回该值对应的包装对象

澳门新葡萄京888官网 5

  • Object对象实例的属性和方法

Object对象本身是一个构造函数,可以利用Object构造函数构造对象实例

var person = new Object();
person.name = "teren";
//字面量方法
var person = {name: "teren"};

【注】
所有的对象都是由Object构造出来的;
字面量创建对象的方法和利用Object()构造对象的方法是等价的;

Object对象有不少方法部署在Object.prototype对象上,所有的Object的对象实例都继承这些方法

1.Object.prototype.valueOf()
valueOf()方法返回一个对象的“值”。默认情况下,返回对象本身

var o = {name:"teren"}
o.valueOf()//Object {name: "teren"}
var p = {name:"teren",age:18}
p.valueOf()//Object {name: "teren", age: 18}
var q = {}
q.valueOf()//Object {}

【注】
valueOf方法的主要用途是,JavaScript自动类型转换时会默认调用这个方法

2.Object.prototype.toString()
toString方法返回一个对象的字符串形式,默认情况下返回类型字符串

var o ={name:"teren"}
o.toString()//"[object Object]"

【注】
toString方法的主要用于是,JavaScript自动类型转换时会默认调用这个方法

var o = {}
o   "world"//"[object Object]world"

3.hasOwnProperty()
hasOwnProperty():判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性,若继承自原型则返回false

var o = {name:"teren"}
o.hasOwnProperty("name")//true
o.hasOwnProperty("toString")//false

4.propertyIsEnumerable():判断某个属性是否可枚举(遍历)

var arr = [1,2,3]
for(var key in arr){console.log(arr[key])}
1
2
3
arr.propertyIsEnumerable("0")//true
arr.propertyIsEnumerable("length")//false

二、心得体会
今天完成了什么?
1.听剑爸讲解app.rb
2.读了《Programming Ruby》的第2.6-8节
3.试着解释app.rb昨天剩余的部分
4.跟小白探讨网站的模型、视图等等之间的关系

10.标准库小结

  • 标准库是js的初始提供的标准内置对象,分为Object对象、Number对象、String对象、Boolean对象、Array对象、Math对象以及Date对象
    【注】不限于上述对象,还有RegExp对象和JSON对象

  • js所有的对象都是由Object对象构造的,包括其对象实例以及Number、String、Boolean、Array、Math和Date等对象;

  • 对象一般都会包含属性和方法,属性代表属于对象的某些特征值,方法代表对象的某些功能;

  • 对象在属性当中通常设置constructor(Math对象没有)和prototype属性,部分对象包括length属性(String和Arrary对象的length有实践意义);conStructor设置该对象的构造函数功能,prototype设置一个原型对象——使得所有该对象的构造函数创建的对象实例能够从prototype对象中继承相应的属性;

  • Object对象的属性和方法最具一般性,大部分属性和方法可以在其他对象中找到,但是每一个对象还具有各自的属性和方法(有些只能对象使用,有些能够对象实例使用(因为部署在各自对象的prototype里))

  • 这里特别说一下valueOf()、toString()在不同对象中的效果,一般valueOf()输出对象的原始值,toString()输出字符串

var o = new Object(123)
var o1 = new Object("123)
o.valueOf()//123
o.toString()//"123"
o1.valueOf()//"123"
o1.toString()//"123"
var o2 = [1,2,3]
o2.valueOf()//[1, 2, 3]
o2.toString()//"1,2,3"
var o3 = {name:"teren",age:18}
o3.valueOf()//Object {name: "teren", age: 18}
o3.toString()//"[object Object]"
  • Number对象是数值对应的包装对象,String对象是字符串对应的包装对象,Boolean是布尔值对应的包装对象
var num = 123//type of num -> "number"
var num = new Number(123) //type of num -> "object"
var str = "hello" 
var str = new String("hello")
var bool = true;
var bool = new Boolean(true)

【注】本笔记的资料大部分参考阮一峰的JavaScript标准参考教程

  • 下面的例子显示了如何使用yield语句,定义了一个方法,它会调用yield两次,然后调用这个方法,把block放在同一行,在方法调用之后(并在方法的所有参数之后)。

3.Number对象及其实例

Number对象是数值对应的包装对象,所谓包装对象如下面例子所示:

var num = 123//这是一个数据类型为数值的数值
var num = new Number(123)//这里通过Number函数构造一个对象,从而把数值123包装进Number对象中
  • Number对象的属性和方法
    1.Number对象的属性
Number.MAX_VALUE
Number.MIN_VALUE
Number.POSITIVE_INFINITY
Number.NEGATIVE_INFINITY
Number.NaN

【注】
Number对象实例是无法获取去Number对象的属性

var x = new Number(123);
x.MAX_VALUE;//undefined

2.Number对象的方法

1.Number()自身的方法
将任何类型的值转化为数值
Number(100)//100
Number("100")//100
Number("100e")//NaN
Number([1,2,3])//NaN
Number(true)//1
Number([])//0
Number({})//NaN
2.toFixed()
把数字转换为字符串,并保留几位小数
var a = 123
a.toFixed(2)//"123.00"
a.toFixed(3)//"123.000"
a.toFixed(0)//"123"
3.toExponential()
把对象的值转换为科学计数法的字符串
a.toExponential(1)//"1.2e 2"
a.toExponential(2)//"1.23e 2"
a.toExponential(3)//"1.230e 2"
a.toExponential(4)//"1.2300e 2"
4.valueOf()
a.valueOf()//123
5.toString()
a.toString()//"123"
6.isFinite()
Number.isFinite(123)//true
Number.isFinite(NaN)//false
7.isNaN()
Number.isNaN(NaN)//true

下图是Number对象继承自Object对象的属性和方法,以及专属于Number的属性和方法

澳门新葡萄京888官网 6

  • Number对象实例的属性和方法
//构造Number对象的实例
var num = new Number(123)

【注】
Number对象实例所运用到的属性和方法基本包含在Number对象的属性和方法中

6.Array对象

Array对象是数组的包装对象

  • 创建一个Array对象实例
var array = new Array(1,2,3)
//字面量方法
var arr = [1,2,3]
  • Array对象的属性
length属性
var arr= [1,2,3]
arr.length//3
  • Array对象的方法
1.valueOf & toStrng()
valueOf返回数组对象原始值
toString()返回字符串
var arr = [1,2,3]
arr.valueOf()//[1, 2, 3]
arr.toString()//"1,2,3"
2.增加数组元素
arr.push() & arr.unshift()//一个在尾部一个在首部增加元素,并返回新数组的长度
arr.push("h","e","e")//6
arr//[1, 2, 3, "h", "e", "e"]
arr.unshift(1,1,1)//9
arr//[1, 1, 1, 1, 2, 3, "h", "e", "e"]
3.删除数组元素
arr.pop() & arr.shift()//一个在尾部一个在首部删除元素,并返回删除的元素,每次调用只能删一个
var arr = [1, 1, 1, 1, 2, 3, "h", "e", "e"]
arr.pop()//"e"
arr//[1, 1, 1, 1, 2, 3, "h", "e"]
arr.shift()//1
arr//[1, 1, 1, 2, 3, "h", "e"]
4.灵活删除增添元素的方法
var arr = [1, 1, 1, 1, 2, 3, "h", "e", "e"]
arr.splice(0,4,"w","y")//[1, 1, 1, 1]
arr//["w", "y", 2, 3, "h", "e", "e"]
5.join(separator)
把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔
var arr = [1, 1, 1, 1, 2, 3, "h", "e", "e"]
arr.join("-")//"1-1-1-1-2-3-h-e-e"
6.sort(func)
var arr = [1, 1, 1, 1, 2, 3, "h", "e", "e"]
arr.sort()//[1, 1, 1, 1, 2, 3, "e", "e", "h"]
7.reverse()
var arr = [1, 1, 1, 1, 2, 3, "h", "e", "e"]
arr.reverse()//["e", "e", "h", 3, 2, 1, 1, 1, 1]
8.concat()
合并数组
var a =[1,3,4]
var b = [4,2,1]
a.concat(b)//[1, 3, 4, 4, 2, 1]

【注】
Array对象实例所运用到的属性和方法基本包含在Array对象的属性和方法中

目录
1.什么是标准库
2.Object对象及其实例
3.Number对象及其实例
4.String对象及其实例
5.Boolean对象及其实例
6.Array对象及其实例
7.Math对象及其实例
8.Date对象
9.标准库小结

ap Group::Post
def call_block
    yield("hello", 99)
end
call_block { |str,  num| ... }

今天学到了什么?

2.7 读/写文件

Start of method
In the block
In the block
End of method
def call_block
    puts "Start of method"
    yield
    yield
    puts "End of method"
end

输出结果:
Number:1.23,
String:"hello"
在这个例子中,"Number: %5.2f, nString: %n"格式化字符串,告诉printf替换一个浮点数(最多允许5个字符串, 并且2个在小数点后面)和一个字符串。注意到回车换行符(n)嵌入到格式化中:回车换行符把输出移动到下一行。

为什么有两种分解符呢?部分是有人觉得有时候用一种分解符比另外一种感觉更自然。另外一部分原因是它们有不同的优先级:花括号比do/end绑定的更紧密些,在本书中,我们尝试遵循正在成为Ruby标准的一个约定俗成,单行block用花括号,多行block用do/end。

ruby:
  fields = {
    name: { edit: true },
    parent_id: { edit: -> (f) { f.grouped_collection_select :parent_id, [ [ '一级', [ model.root ] ],...class: 'width-100 Chosen' } },
    children: {},
    orders: {},
    words: {},
  }
= render 'admin/.../form', fields: fields
  • slim模板 致力于减少视图语法代码,方便、快捷
    举个例子:
verbose_greet("Dave", "loyal customer")  { puts "Hi" }
cat dog horse *****3456abcde
{ puts "Hello" }
do
    club.enroll(person)
    person.socialize
end
  • 有许多方式可以把输入读到程序中:回车换行符把输出移动到下一行。
  • 有许多方式可以把输入读到程序中,最传统的方式是使用gets函数,它从程序的标准输入流中读取下一行。
  • 许多内建于C和Java等语言的循环结构在Ruby中只是方法调用,这些方法会零次或多次调用相关联的block。
['cat', 'dog', 'horse'].each { |name| print name, " " }
5.times { print "*" }
3.upto(6) { |i| print i }
('a'..'e').each { |char| print char }

输出结果:

上面的代码要求对象5 五次调用block;然后要求对象3 调用一个block,并传入一个连续的值,直到这个值到达6为止。最后对a到e的字符区间(range),使用each方法调用block。

  • 一旦创建了block,就可以与方法的调用相关联。把block的开始放在含有方法调用的源码行的结尾处,就可以实现关联。比如,在下面的代码中,含有puts "Hi"的block与greet方法的调用相关联。

  • greet { puts "Hi" }
    如果方法有参数,它们出现在block之前。

一、读书笔记
2.6 Block和迭代器

  • Ruby有一个完备的I/O库,但是本书的大多数例子只使用其中一些简单的方法,已经碰到了两个用来输出的方法。puts输出参数,并在每个参数后面添加回车换行符。print也输出它的参数,但没有添加换行符。它们都可以用来向任何I/O对象进行输出,但在默认情况下,它们输出到标准输出。

  • 另一个常用的输出方法是printf,它在一个格式化字符串的控制下打印出它的参数(就像C或Perl中的prinf)。

animals = %w( ant bee cat dog elk )  # 创建一个数组
animals.each { |animal| puts animal }  # 迭代它的内容
输出结果:
ant
bee
cat
dog
elk

代码理解:

  def ix
    @records = (@records || model)
      .ransack(params[:q]).result(distinct: true) # 搜索那些不重复的记录
      .order([ params[:order].to_s.match(/A(w )s(asc|desc)Z/).try(:[], 1..2) || %w[ id desc ] ].to_h) # 排序
      .page(params[:page]).per(params[:per]) #分页

    respond_to do |format| #导出格式
      format.html
     ...
    end
  end

  def rt
    return redirect_to @url if @url = current_user.admin_operator.try(:url).presence #判断是否有登录和操作权限
    render html: '', layout: true
  end

  private

  def rd_with_record
    respond_to do |format|
      format.html do
       ....
      end
      format.json { render json: @record.as_json(model.admin_json_options || model.json_options || { only: %i[ id ] }), status: request.get? ? :ok : !@saved ? :unprocessable_entity : params[:action] == 'create' ? :created : :accepted }
    end
  end

  def ce_log
    return if request.get? && !(params[:controller] == 'admin/bag/orders' && params[:action].starts_with?('stats_'))
    Admin::Log.create({
      operator: current_user.admin_operator, # 操作权限
      resource: params[:controller].remove(/^admin//).singularize, # 资源
      action: params[:action], # 动作
      paramid: params[:id], # id
    })
  end

  def rs_data # 导出数据
    fields = [ :id ]   (model.export_fields || [])   [ :created_at, :updated_at ].find_all { |field| model.column_for_attribute(field) } # 选择要导出的栏位
    header = fields.map { |field| model.human_attribute_name(model.reflections[field.to_s].try(:foreign_key) || field) } # 导出的栏位标题
    body = @records.map do |record| # 主要内容
      fields.map do |field|
        next I18n.t("activerecord.enums.#{model.name.underscore}.#{field}").with_indifferent_access[record.send(field)] if model.defined_enums.with_indifferent_access[field]
        case value = field.to_s.split('.').inject(record) { |object, method| object.try(method) }
        when true
          '✔'
        when false
          '✘'
       ....
        else
          value
        end
      end
    end
    [ header ]   body
  end

end

在Ruby库中大量使用了block来实现迭代器:迭代器是从某种收集(collection)如数组中连续返回元素的方法。

然后使用Ruby的yield语句,方法可以一次或多次地调用(invoke)相关联的block。可以把yield想象成比如方法调用,它调用含有yield语句的方法所关联的block。

输出结果:

line = gets
print line
  • 让我们看一下如何实现应用在前面例子中的Array类中的each迭代器。each迭代器循环处理数组中的元素,对每个元素调用yield。在伪码中,它可能写成:
    在Array类中... ...
  • try 如果接收对象是零对象或NilClass,则NoMethodError异常将不会被引发,否则将返回nil。
  • distinct: true
  • to_s 用于将对象显示为字符串,通常是使用put的结果;注意,甚至可以通过覆盖检查,来覆盖显示对象的内容。
  • to_h 返回此参数的安全哈希表示,并删除所有未提交的键。
  • awesome_print 可以全面打印Ruby对象,举个例子:
printf("Number: %5.2f, nString: %sn", 1.23, "hello")

本文由澳门新葡萄京娱乐网站发布于web前端,转载请注明出处:JavaScript门道之标准库【澳门新葡萄京888官网】

关键词: